当前位置: 代码迷 >> 综合 >> upper_bound and lower_bound
  详细解决方案

upper_bound and lower_bound

热度:89   发布时间:2024-02-24 23:08:18.0

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个有序数组中进行查找的。

在从小到大的排序数组中

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字找到则返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字找到则返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

在从大到小的排序数组中

重载lower_bound()和upper_bound()

lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 2*int(1e9) + 10;
#define LL long longint cmd(int a, int b){return a > b;
}int main(){int num[6] = {1,2,4,7,15,34}; sort(num, num+6);                           //按从小到大排序 int pos1 = lower_bound(num, num+6, 7) - num;    //返回数组中第一个大于或等于被查数的值 int pos2 = upper_bound(num, num+6, 7) - num;    //返回数组中第一个大于被查数的值cout << pos1 << "  " << num[pos1] << endl;cout < <pos2 << " " << num[pos2] << endl;sort(num, num+6, cmd);                      //按从大到小排序int pos3 = lower_bound(num, num+6,7, greater<int>())-num;  //返回数组中第一个小于或等于被查数的值 int pos4 = upper_bound(num, num+6,7, greater<int>())-num;  //返回数组中第一个小于被查数的值  cout << pos3 << " " << num[pos3] << endl;cout << pos4 << " " << num[pos4] << endl;return 0;	
}