【题目描述】
【思路】
如果存在那就很方便,直接indexof就行,但是不存在,就要寻找数组中最接近target的那个数
可以用target减去数组中所有的值再求绝对值,得到一个差值的数组,再寻找差值数组中最小的数。如果最小的数仅有一个,那么target要么插在他的左边,要么就是右边,比较一下大小即可;如果最小的数有两个,那么必定插在第一个最小值后。
例如:[1,3,5,6],target=4
差值数组为[3,1,1,2],有两个最小值,那么必定插在第一个最小值的右边,也就是返回值为第一个最小值的下标+1
例如:[1,3,7,9],target=4
差值数组为[3,1,3,5],就要比较一下target和差值为1的这个数哪个数大。target大,那就返回下标+1;target小,就直接返回第一个最小值的下标
【注意的是】
Math.min或者Math.max不能直接寻找数组中的最小值,就是说
arr = [1,2,3,4,5]
Math.max(arr) 返回的是undefined
必须要这样使用:
var array=[2,7,5,8,9];
Math.min.apply(null,array);
参考文章:Javascript复习--Math.min和Math.max方法_入不了门的猿-CSDN博客_math.min
【代码】
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
var exist = nums.indexOf(target)//先判断target是否存在与原数组中
var differ = []//存储差值数组
result = 0//返回值
if(exist >= 0){
result = exist//存在,直接返回下标
}
if(exist < 0 ){//不存在,先得到差值的绝对值,构成一个数组
for(var i = 0 ; i < nums.length ; i++){
differ.push(Math.abs(target-nums[i]))
}
var minNumber = Math.min.apply(null ,differ)//寻找数组中的最小值
var index = differ.indexOf(minNumber)
var index2 =differ.lastIndexOf(minNumber)
console.log(index,index2)
if(index == index2){//最小值只有一个
result = (target>nums[index])?index+1:index
}
if(index != index2){//最小值有两个
result = index+1
}
}
if(target < nums[0]){//如果target比第一个小,或者比最后一个大,就可以直接指定插入的位置,这样跑的速度会更快
result = 0
}
if(target > nums[nums.length-1]){
result = nums.length
}
return result
};
nums = [3,4,9,10]
target = 5
console.log(searchInsert(nums,target))
【结果】