本文是通过二分法来查找在递增序列中的某个重复数上下区间(闭区间)的
如:
1,2,2,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,8,8,8,9
中6
的数组中的区间是[4,29]
代码:
lowerBound()
找下界,upperBound()
找上界,代码就一行不一样。
#include<iostream>
#include<vector>
using namespace std;
int lowerBound(vector<int>nums,int key)
{
int left = 0,right = nums.size()-1;
int ans = -1; //没找到会返回-1
while(left <= right)
{
int mid = (left + right)>>1; //== int mid = (left+right)/2;
if(nums[mid] == key)
{
ans = mid;
right = mid - 1; //下界肯定在[left,mid]中
}
else if(nums[mid] > key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ans;
}
int upperBound(vector<int>nums,int key)
{
int left = 0,right = nums.size()-1;
int ans = -1;
while(left <= right)
{
int mid = (left + right)>>1;
if(nums[mid] == key)
{
ans = mid;
left = mid + 1; //上界肯定在[mid,right]中
}
else if(nums[mid] > key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return ans;
}
int main(){
vector<int>nums = {1,2,2,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,8,8,8,9};
cout<<lowerBound(nums,6)<<endl;
cout<<upperBound(nums,6)<<endl;
return 0;
}