今天是练习算法的第三天
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 };
两者的对比,其实从代码可读性来看,其实我个人认为还是第二次写的更好一些