lower_bound和upper_bound
algorithm库中基于二分查找的高效工具,时间复杂度均为 \(O(\log n)\)
使用前提
被搜索的数组(或容器区间)必须是有序的(单调递增或单调递减)。如果数组无序,结果是未定义的。
核心区别
处理“相等”元素时的逻辑,以及配合比较器(如 greater
lower_bound(begin, end, val)
寻找第一个 大于等于 (\(\ge\)) val 的元素。(如果我想把 val 插入数组并保持有序,这是我可以插入的最左边的位置。)
返回值:迭代器(如果所有数都比 val 小,返回 end。)
upper_bound(begin, end, val)
寻找第一个 大于 (\(>\)) val 的元素(严格大于)。(如果我想把 val 插入数组并保持有序,这是我可以插入的最右边的位置)
返回值:迭代器(如果所有数都比 val 小或者相等,返回 end。)
当数组是从大到小排列时,我们需要传入比较器 greater<int>()
注:
1>查不存在的元素时,两者通常指向同一个位置。
2>这两个函数返回的是 iterator (迭代器)。要获取数组下标(index),必须减去起始迭代器
vector<int> v = {1, 2, 4, 6};
auto it = lower_bound(v.begin(), v.end(), 4);
// 获取下标
int index = it - v.begin(); // index = 2
// 判断是否没找到 (非常重要!)
if (it == v.end()) {
// 所有元素都比 4 小
}
浙公网安备 33010602011771号