二分查找基础

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

寻找⼀个数

这个场景是最简单的,可能也是最熟悉的,即搜索⼀个数,如果存在,返回其索引,否则返回 -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
func BinarySearch(nums []int, target int) int {
left := 0
right := len(nums) - 1

for left <= right {
// left + (right-left)/2 为防⽌溢出
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
20
func left_bound(nums []int, target int) int {
left := 0
right := len(nums) - 1
for left <= right {
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 >= len(nums) || 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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func right_bound(nums []int, target int) int {
left := 0
right := len(nums) - 1
for left <= right {
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%