题目
https://leetcode-cn.com/problems/search-insert-position/
思路
最基础的二分法,有一个亮点就是思考怎么找到被插入的数字的位置
1. 注意js的除法是会自动计算出小数的,所以计算mid的时候要注意写成是Math.floor( )
2. 当数字不存在时,插入的位置就是lower的位置。
因为在最后一次循环的时候,一定有lower = upper = mid;
然后,假如插入的数比这个位置的数大,那么就会有lower = mid + 1;
假如插入的数比这个位置的数小,那么这个位置正好是它应该被插入的地方
3. lower <= upper的话,搜索区间是[lower, upper]
lower < upper的话,搜索区间是[lower, upper)
代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let lower = 0;
let upper = nums.length - 1;
let mid = 0;
while (lower <= upper){
mid = lower + Math.floor((upper - lower)/2);
if (nums[mid] === target){
return mid;
}
else if (nums[mid] < target){
lower = mid + 1;
}
else{
upper = mid - 1;
}
}
return lower;//如果都没找到的话,插入的位置应该就是lower的位置
};
代码v2
如果条件换成了left < right该怎么写代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left = 0;
let right = nums.length - 1;
let mid;
while(left < right){
mid = left + Math.floor((right - left)/2);
if(nums[mid] === target) return mid;
else if(nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
// 这里要对left所指的数作出判断,因为left = right停止的时候并不知道这个位置的大小情况
//所以要检查这个位置
if(nums[left]>=target) return left;
else return left + 1;
};