无重复元素
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
int middle = 0;
while (left <= right){
middle = left - (left - right) / 2;
if (nums[middle] < target)
left = middle + 1;
else if (nums[middle] > target)
right = middle - 1;
else if (nums[middle] == target)
return middle;
}
return left;
}
};
区间是[left, right] 闭区间。最后 left 和 right 的位置分为两种情况
- target 在数组中存在: left = right = middle = target
- target 在数组中不存在: 区间变为[right, left],target 在中间 例如数组[1, 3, 5, 6], target = 4, 则 right = 1, left = 2; 例如数组[1, 3, 5, 6], target = 0, 则 right = -1, left = 0;
有重复元素
lower bound
private int lowerBound(int[] arr, int target) {
int left = 0, right = arr.length - 1;
while (left <= right) {
int mid = left - (left - right) / 2;
if (arr[mid] < target) {
left = mid + 1;
} else if (arr[mid] >= target) {
right = mid - 1;
}
}
return left;
}
Higher bound
private int higherBound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left - (left - right) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] <= target) {
left = mid + 1;
}
}
return right;
}