尝试去做力扣第35题:搜索插入位置
这道题可以转化为寻找数组中最小的大于等于 target 的值的位置。
因此可以将数组分成两个部分,左部分是小于 target 的值,右部分是 大于等于 target 的值。这道题数组中的元素具有二段性,可以采用二分法,利用 left 和 right 逐渐逼近结果值并且在结果值处会合。
这道题要注意以下细节:(n 为数组长度)
- 因为使用 [left, right] 进行二分法,所以 left 初始化为 0, right 初始化为 n - 1
- 注意,这道题与传统的二分法不同,使用 left <= right 会进入死循环!因为左部分是小于 target 的值, 右侧是大于等于 target 的值,所以要使 left 和 right 在目标位置会和,left 指针始终都在尝试“跳出”左部分,而right 指针要留在右部分,因此 left < right 时进入循环即可,而 left <= right 会陷入死循环。
- 如上条所讲,left 要跳出左部分, 当 nums[mid] < target 时,left = mid + 1,而 right 要留在右部分,所以当 nums[mid] >= target 时,right = mid。
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
if(target > nums[n - 1]) return n;
int left = 0, right = n - 1;
while(left < right) {
int mid = left + ((right - left) >> 1);
if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
}