关于二分查找的一些个人记录
正常的二分查找
在这里插入代码片
int BinaryFind(vector<int>& arr,int k){
int left=0,right=arr.size();
while(left<right){
int mid=(left+right)/2;
if(arr[mid]==k){
return mid;
}else if(arr[mid]<k){
left = mid+1;
}else{
//因为在开始时就选择比真实数据大一位,所以这里不需要减一
right = mid;
}
}
// 该数据不存在
return -1;
}
查找最大的小于等于K的值
int BinaryFindMaxVal(vector<int>& arr,int k){
//每一个数都有取到的可能所以,最大值减一
int left=0,right=arr.size()-1;
while(left<right){
//这里尽量取高位,因为在判断里,当小于等于时已经取了低位,
//如果这里不取高位的话,会陷入死循环
int mid=(left+right+1)/2;
if(arr[mid]<=k){
left = mid;
}else{
right = mid-1;
}
}
if(arr[left]>k)
return -1;
return left;
}
查找最小的的大于等于K的值
int BinaryFindMinVal(vector<int>& arr,int k){
int left=0,right=arr.size()-1;
while(left<right){
int mid=(left+right)/2;
if(arr[mid]<k){
left = mid+1;
}else{
right = mid;
}
}
if(arr[right]<k)
return -1;
return right;
}
详细讲解可参考:
https://my.oschina.net/u/4290892/blog/3501173