c++实现了lower_bound,即一个数的ceil操作,可以用来实现一个范围的查找问题,需要注意的是lower_bound(v),返回会的是查找数v的ceil的迭代器(指针),返回的这个ceil的值就是set中大于v的最小的那个数。
void example(){
int v = 0;
set<int> record; // 一个set
// 在set中查找大于v的最小的值有没有
set<int>::iterator it = record.lower_bound(v);
// it不等于 record.end()所以查找到了
if (it != record.end())
cout << *it << endl;
// 可以对 查找到的这个值 *it做其他的一些操作
}
利用lower_bound可以完成的例题如下:
220. Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k.
给定一个数组nums,查找是否存在这样的两个数他们的:
- 位置i和j之差不超过k;
- nums[i]与nums[j]不超过t,即是
|nums[i]−nums[j]|<=t
其中,nums[i]是当前考察的元素(我们设其为v),numm[j]是已经放到set中的元素(我们设其为x),t是输入给定的,如果t<0肯定是无解的,因此输入需要满足t>=0,也就是要满足,
|v−x|<=t
也就是看这个成立不,
v−t<x<=v+t
因此,我们看set存不存在x,也就要判断如下式子成立不:
lower_bound(v−t)<=v+t
代码:
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
set<long long> record;
for (int i = 0; i < nums.size(); i++){
if (record.lower_bound((long long)nums[i] - (long long)t) != record.end() &&
*record.lower_bound((long long)nums[i] - (long long)t) <= (long long)nums[i] + (long long)t){
return true;
}
record.insert(nums[i]);
if (record.size() == k + 1){
record.erase(nums[i - k]);
}
}
return false;
}
};
上述使用long long 类型是为了解决整型溢出问题。