int lower(vector<int> arr, int tar) {
int l = 0, r = arr.size();
while (l < r) {
int mid = l + (r - l) / 2;
if (tar > arr[mid]) l = mid + 1;
else r = mid;
}
}
int upper(vector<int> arr, int tar) {
int l = 0, r = arr.size();
while (l < r) {
int mid = l + (r - l) / 2;
if (tar >= arr[mid]) l = mid + 1;
else r = mid;
}
}
总是记混这两个查找方法,今天写篇博客 MARK 一下。
lower_bound 查找的为 第一个大于等于当前查找数的位置;
upper_bound 查找的为 第一个严格大于当前查找数的位置。
若查找元素不存在,则两个方法返回同样的位置。
#include <bits\stdc++.h>
using namespace std;
int main(){
vector<int> arr{12,15,17,19,20,22,23,26,29,35,40,51};
auto a = lower_bound(arr.begin(), arr.end(), 21);
auto b = lower_bound(arr.begin(), arr.end(), 22);
auto c = upper_bound(arr.begin(), arr.end(), 21);
auto d = upper_bound(arr.begin(), arr.end(), 22);
cout<<*a<<' '<<*b<<' '<<*c<<' '<<*d<<endl;
// 22 22 22 23
return 0;
}