二分法:适用于有序序列查找
1. 查找一个数
如果有重复元素,则查找第一个满足条件的数
class Solution{
public:
int BinarySearch(vector<int>& nums, int target){
int n = nums.size();
int left = 0, right = n - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] == target) return mid;
else if(nums[mid] > target) right = mid - 1;
else if(num[mid] < target) left = mid + 1;
}
}
return -1;
};
2. 查找满足一定条件的左边界
1.如果[left, right]中所有元素都满足条件 → [left, mid - 1],右边界向左收缩
2.如果[left, right]中存在某些元素不满足条件 → [mid + 1, right]
class Solution {
public:
int hIndex(vector<int>& nums, int target) {
int n = nums.size();
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= target) right = mid - 1; //满足此条件的左边界
else if(nums[mid] < target) left = mid + 1;
}
return left;
}
};
3. 查找满足一定条件的右边界
1.如果[left, right]中所有元素都满足条件 → [mid + 1, right],左边界向右收缩
2.如果[left, right]中存在某些元素不满足条件 → [left, mid - 1]
class Solution{
public:
int BinarySearch(vector<int>& nums, int target){
int n = nums.size();
int left = 0, right = n - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] <= target) left = mid + 1; //满足此条件的右边界
else if(nums > target) right = mid - 1;
}
return right;
}
};