题目

代码
升序+O(logn)一秒想到二分查找。
javascript
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
let left = 0, right = nums.length - 1
while (left <= right) {
let mid = Math.floor((left + right) / 2)
if (nums[mid] === target) {
return mid
} else if (nums[mid] < target) {
left = mid + 1
} else {
right = mid - 1
}
}
return left
};
1.要注意边界的问题。
最开始写的循环条件是left < right,但这样对于最大的要插入数组末尾的数就不行了,边界会丢失。改为left <= right问题就解决了。
示例 1:nums=[1,3,5,6], target=7
-
正确插入位置应为
4(末尾)。 -
原代码:
left=0, right=3→ mid=1 (3<7) → left=2left=2, right=3→ mid=2 (5<7) → left=3left=3, right=3→ 循环结束,返回3❌
示例 2:nums=[1,3,5,6], target=2
-
正确插入位置应为
1。 -
原代码:
left=0, right=3→ mid=1 (3>2) → right=0left=0, right=0→ 循环结束,返回0❌
示例 3:nums=[1], target=2
-
正确插入位置应为
1。 -
原代码:
left=0,right=0,循环不执行,返回0❌
2.为什么返回 left?
循环结束时 left > right,且 left 指向第一个大于 target 的元素的位置(如果 target 大于所有元素,则 left = nums.length)。