文章目录
- 常规二分
- 二分查找左边界
- 二分查找右边界
常规二分
int search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = n - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){
r = mid - 1;
}else{
l = mid + 1;
}
}
return -1;
}
二分查找左边界
int left_bound(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
r = mid - 1;
}
else if (nums[mid] > target) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
// 如果搜索的数字比所有的都大,最终right位置在最后一个元素,left = right+1
// 如果搜索的数字比所有的都小,最终left 在0 。所以如果left>=nums.length || nums[left]!=target则未找到
if (l >= n || nums[l] != target) return -1;
return l;
}
二分查找右边界
int right_bound(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
l = mid + 1;
}
else if (nums[mid] > target) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
// 如果搜索的数字比所有的都大,最终right位置在最后一个元素,left = right+1
// 如果搜索的数字比所有的都小,最终l在0,r = l - 1。所以如果r < 0 || nums[r] != target则未找到
if (r < 0 || nums[r] != target) return -1;
return r;
}