首先记得 #include < algorithm >
在vector中使用
lower_bound作用
在 非递减序列中 找到 第一个大于或者等于 某个元素的位置,如果找得到,返回相应的迭代器,否则,返回范围中的尾迭代器。
使用示例
vector<int> nums = { 3,2,4,1,5 };
sort(nums.begin(), nums.end());
auto iter = lower_bound(nums.begin(), nums.end(), 1);
cout << iter - nums.begin() << endl;
upper_bound作用
在 非递减序列中 找到 第一个大于 某个元素的位置,如果找得到,返回相应的迭代器,否则,返回范围中的尾迭代器。
使用示例
vector<int> nums = { 3,2,4,1,5 };
sort(nums.begin(), nums.end());
auto iter = upper_bound(nums.begin(), nums.end(), 1);
cout << iter - nums.begin() << endl;
在map中使用
由于map本身就是按照key进行排序的(默认就是升序),所以,在map中可以直接使用。在map中使用时,lower_bound和upper_bound的功能和之前是一样的。
使用示例
map<int, int> m;
m.insert({ 2, 4 });
m.insert({ 1, 3 });
m.insert({ 3, 7 });
m.insert({ 5, 5 });
m.insert({ 4, 6 });
auto iter = m.lower_bound(3);//auto iter = m.upper_bound(3);
cout << iter->first << " , " << iter->second << endl;
总结
注意,lower_bound和upper_bound的时间复杂度都是O(logn)
leetcode题目
代码
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
vector<int> res;
map<int, int> m;
for(int i = 0; i < intervals.size(); i++) m[intervals[i][0]] = i;
for(auto e : intervals){
auto it = m.lower_bound(e[1]);
if(it != m.end()) res.push_back(-1);
else res.push_back(it->second);
}
return res;
}
};