0
点赞
收藏
分享

微信扫一扫

二分查找模板 low_bound、upper_bound

下标从1开始,返回长度为n的数组a中最后一个等于key的下标

int search1(int a[], int n, int key){
int l = 1, r = n, ans;
while (l <= r){
int mid = (l + r) / 2;
if (a[mid] <= key){
l = mid + 1;
ans = mid;
}else{
r = mid - 1;
}
}
return a[ans]==key ? ans : -1;
}

下标从1开始,返回长度为n的数组a中最第一个等于key的下标

int search2(int a[], int n, int key){
int l = 1, r = n, ans;
while (l <= r){
int mid = (l + r) / 2;
if (a[mid] < key){
l = mid + 1;
}else{
r = mid - 1;
ans = mid;
}
}
return a[ans] == key ? ans, -1;
}

low_bound、upper_bound

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
int a[11]={0,1,2,3,4,4,4,5,6,7,8};
//lower_bound(begin, end, key)
//二从数组的begin位置到end-1位置二分查找第一个大于或等于key的数字,
//找到返回该数字的地址,不存在则返回end。
int pos = lower_bound(a+1, a+10+1, 4) - a;
cout<<pos<<endl;

//upper_bound(begin, end, key)
//从数组的begin位置到end-1位置二分查找第一个大于key的数字,
//找到返回该数字的地址,不存在则返回end。
int pos2 = upper_bound(a+1, a+10+1, 4) - a;
cout<<pos2<<endl;
return 0;
}


举报

相关推荐

0 条评论