二分查找专题
二分查找模板:
寻找右边界
int right_bound(int l, int r) {
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
寻找左边界
int left_bound(int l, int r) {
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
Leetcode题目
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0,r=nums.size()-1;
while(l<r){
int mid=(l+r+1)>>1;
if(nums[mid]<=target){
l=mid;
}
else{
r=mid-1;
}
}
if(nums[l]==target)
return l;
else
return -1;
}
};
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
long long l=1,r=n;
while(l<r){
long long mid=(l+r)>>1;
if(!isBadVersion(mid)){//如果是正确的
l=mid+1;
}
else{
r=mid;
}
}
return r;
}
};
需要注意插入的位置其实就是搜索的位置,不需要-1
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l=0,r=nums.size();
while(l<r){
int mid=(l+r)>>1;
if(nums[mid]<target){
l=mid+1;
}
else{
r=mid;
}
}
return l;
}
};