Java教程

算法练习第三天(简单)搜索插入位置

本文主要是介绍算法练习第三天(简单)搜索插入位置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

今天是练习算法的第三天

题目描述:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

注意:题目要求的是:时间复杂度必须是O(log n)

知识点回顾:O(log n)的本质:输入规模翻倍,操作次数只增加一(具体可以参考国王赏麦的那个故事,就是我们初中学幂运算的那个例子)

         解题分析:首先,我们需要做出判断,目标值是否在数组中,如果在数组中,那么我们就可以直接使用第一天的二分查找直接循环出结果;但是如果目标值不在数组中,这时我们该怎么办呢?我的思路是那就将这个目标值插入到数组中,因为这个数组是按照升序排列的,所以我们也需要将他按照升序排列,这样才能满足题目的要求,于是动手之后的结果如下:

var searchInsert = function(nums, target) {
    if(nums.indexOf(target)== -1){
        nums.push(target)
    }
    nums.sort((a,b)=>a-b);
    var low=0,high=nums.length;
    while(low<=high){
        mid=Math.floor((low+high)/2)
        if(nums[mid]>target){
            high=mid-1
        }else if(nums[mid]==target){
            return mid
        }else
            low=mid+1
    }
    return mid
};

关于函数的选择:我在判断数组中是否有这个目标值的时候,选择的是indexof,当然也可以选择其他的函数来判断如find、findIndex等等,在if中使用push插入这个数值,之后将他升序排列一下即可。

当我提交之后,我发现其实这道题在我之前刷算法题目的时候,自己已经写过了,但是我发现今天写的这个要比以前写的执行时间更短,内存消耗也更少,但还是将这个代码放出来,供大家参考,一起学习!

var searchInsert = function(nums, target) {
    var a
    function findMeth(num,target){
        for(var i in num){
            if(num[i] === target){
                return a =i
            }
        }
    }
    var a =(nums.concat(target))
    var b =a.sort(function(a,b){
        return a-b
    })
    findMeth(a,target)
    return a
};

两者的对比,其实从代码可读性来看,其实我个人认为还是第二次写的更好一些

这篇关于算法练习第三天(简单)搜索插入位置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!