题目
思路
从题目描述和示例可以看出,本题可以转化为:
找到第一个大于等于target的位置,如果都小于target,则返回arr.length
那如何找到第一个大于等于target的位置呢?用二分法,如果:
- arr [mid] < target:mid及mid左边的数都小于target,不可能成为大于target的数,排除,
l = mid + 1
- arr[mid] >= target:mid及mid右边的数都大于等于target,但mid右边的数不可能成为大于target的第一个数,也可以排除,
r = mid
这样到最后,当排除完所有不可能的数以后,只会剩下一个数,再来检查这个数是否小于target:
- 如果小于,说明数组中的数都小于target,需要返回
arr.length
- 否则返回最后这个数,代表插入的位置
代码
public int searchInsert(int[] nums, int target) {
int l = 0;
int r = nums.length-1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] < target) {
l = mid + 1;
} else {
r = mid;
}
}
if (target > nums[l]) {
return nums.length;
}
return l;
}