二分查找思路比较容易,但是总是在边界上容易出问题,总结得到以下两个思路:
int binary_search_before(vector<int> &nums, int target){
//在有序nums中查找target的直接前驱,包括target
int l=0;
int r=nums.size()-1;
while(l<r){
int mid=(l+r+1)/2;
if(nums[mid]<=target){
l=mid;
}
else{
r=mid-1;
}
}
}
(1)在有序vector中查找>=a的最小的一个:
#include<vector>
#include<iostream>
using namespace std;
int binary_search_after(vector<int> &nums,int target){
//在nums中查找大于等于target的最小值,即target的直接后继,包括target
int l=0;
int r=nums.size()-1;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]>=target){
r=mid;
}
else{
l=mid+1;
}
}
return nums[l];
}
(2)在有序vector中查找target的直接前继,即<=target的最大值。