在给定数组有序的情况下 二分查找可以有效降低查找的复杂度至O(logn)
但不排除最坏情况下可能退化到O(n)
二分法核心就是不同条件下边界的收缩,需仔细分析在给定要求下分别有几种不同的比较及边界收缩,以此确定代码
一、二分查找基本框架
int binarySearch(vector<int> nums) {
int left = 0, right = ...;
while(...) {
int mid = left + (right - left) / 2;//防溢出
if (nums[mid] < ...) {
... = ...
}
else if (nums[mid] > ...) {
... = ...
}
}
return ...;
}
二、找一个数
在有序数组1 2 3 4 5 中找 target = 2
int binarySearch(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)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
}
return -1;
}
while 中 left <= right 表明搜索空间是 【left, right】
三、找边界
- 左边界
在 1 2 3 3 3 3 4 中找3的左边界
int left_bound(vector<int> nums, int target) {
if (nums.size() == 0) return -1;
int left = 0;
int right = nums.size();
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
right = mid;
}
else if (nums[mid] < target) {
left = mid + 1;
}
else if (nums[mid] > target) {
right = mid;
}
}
return left;
}
- 右边界
在1 2 3 3 3 3 4 中找3的右边界
int right_bound(vector<int> nums, int target) {
if (nums.size() == 0) return -1;
int left = 0, right = nums.size();
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] == target) {
left = mid + 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid;
}
}
return left - 1;
}

被折叠的 条评论
为什么被折叠?



