二分查找基础

​ 本⽂探究了⼏个最常⽤的⼆分查找场景:寻找⼀个数、寻找左侧边界、寻找右侧边界。

寻找⼀个数

这个场景是最简单的,可能也是最熟悉的,即搜索⼀个数,如果存在,返回其索引,否则返回 -1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int BinarySearch(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;

while(left <= right) {
// left + (right-left)/2 为防⽌溢出
int mid = left + (right-left)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
left = mid + 1;
else if(nums[mid] > target)
right = mid - 1;
}
return -1;
}
寻找左侧边界
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int left_bound(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right) {
int mid = left + (right-left)/2;
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else if(nums[mid] == target) {
// 收缩右边界,锁定左边界
right = mid - 1;
}
}
// 最后要检查 left 越界的情况
if(left>=nums.size() || nums[left]!=target){
return -1;
}
return left;
}
寻找右侧边界
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int right_bound(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right) {
int mid = left + (right-left)/2;
if(nums[mid] < target) {
left = mid + 1
} else if(nums[mid] > target) {
right = mid - 1;
} else if(nums[mid] == target) {
// 收缩左边界,锁定右边界
left = mid + 1;
}
}
// 最后要检查 right 越界的情况
if(right<0 || nums[right]!=target)
return -1;
return right;
}
-------------本文结束 感谢阅读-------------
0%