给定升序无重复数组 nums 和目标值 target,返回目标索引(若存在)或应插入位置(保持有序)。
public class SearchInsert {
public int searchInsert(int[] nums, int target) {
int lo = 0, hi = nums.length - 1;
// 边界预判
if (target <= nums[0]) return 0;
if (target > nums[hi]) return hi + 1;
// 标准二分
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) lo = mid + 1;
else hi = mid - 1;
}
// 循环结束 lo = hi + 1,lo 即插入位置
return lo;
}
}
[0,lo) < target,(hi, n-1] > targetlo = hi+1,恰为第一个 ≥ target 的位置int searchInsert(vector& nums, int target) { int lo = 0, hi = nums.size() - 1; while (lo <= hi) { int mid = lo + (hi - lo) / 2; if (nums[mid] >= target) hi = mid - 1; else lo = mid + 1; } return lo; }
lower_bound:首个 ≥ target(即本题答案)upper_bound:首个 > targetlower_bound(nums.begin(), nums.end(), target) - nums.begin()