1.二分查找模板
https://blog.csdn.net/m0_37302219/article/details/107180126#_7
int search(int* A, int left, int right, int x)
{
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (A[mid] == x)return mid;
else if (A[mid] > x)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
2.lower_bound、upper_bound实现
https://blog.csdn.net/weixin_43939593/article/details/105602530
lower_boud:在排序的数列中查找第一个大于等于target的值的下标
int lower_bound(vector<int>& nums, int x) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left +(right - left) / 2;
if (x > nums[mid]) {
left = mid + 1;//mid比x小,扩大左边距(查找第一个菜但是能打的)
}
else if(x<nums[mid])
right = mid - 1;//mid比x大,缩小右边距到mid-1
else if(x==nums[mid])
right=mid-1;
}
}
return left;
}
upper_bound:在排序的数列中查找第一个大于target的值的下标
int upper_bound(vector<int>& nums, int x) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left +(right - left) / 2;
if (x >nums[mid]) {
left = mid + 1;
}
else if(x==nums[mid])
left=mid+1;//只有这里和lower_bound不一样
else if(x<nums[mid]) {
right = mid - 1;
}
}
return left;
}