算法练习第三天(简单)搜索插入位置
作者:互联网
今天是练习算法的第三天
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
};
两者的对比,其实从代码可读性来看,其实我个人认为还是第二次写的更好一些
标签:return,target,nums,第三天,目标值,插入,算法,数组,var 来源: https://blog.csdn.net/m0_57446284/article/details/121886337