应用
一个数组,左右两段有不同的性质,寻找分段的节点。
方法
两种情况,找左半段的右节点和找右半段的左节点。(如下,分别对应higher_bound和lower_bound)。
步骤:
- 首先确定check函数
- 确定找的节点
- 如果是左半段的右节点,则是
right = mid-1
,这样搜索区间向左移动。同时mid=(left+right)/2+1
,而left=mid
。 - 如果是右半段的左节点,则是
left = mid+1
,这样搜索区间向右移动。同时mid=(left+right)/2
,而right=mid
。 - 最终结束条件是
left=right
,指向我们要找的节点。
- 如果是左半段的右节点,则是
模版
实现lower_bound和higher_bound.
int lower_bound(vector<int>& arr, int target){
// 找到>=target的下标
// check()是>=,找右半段的左节点
int left = 0, right = arr.size()-1;
while(left < right){
int mid = (left + right) / 2;
if(arr[mid] < target){
left = mid + 1;
}
else{
right = mid;
}
}
if(arr[left] == target) return left;
return -1;
}
int higher_bound(vector<int>& arr, int target){
// 找到>target的下标
// check()是>,找左半段的右节点
int left = 0, right = arr.size()-1;
while(left < right){
int mid = (left + right) / 2 + 1;
if(arr[mid] <= target){
left = mid;
}
else{
right = mid - 1;
}
}
if(arr[right] == target) return right;
return -1;
}