Note:
用Set去记录一个滑动窗口, 大小为 K
如果超过了就把最前面的移除掉,要先find在移除,否则可能有重复元素就全部给移除掉了
lower_bound(x) 找到第一个大于等于x的地址 做一次–操作就是找到小于等于x的地址
每次从里面去找一个lower_bound(x)
然后做判断看看是不是返回true
代码如下:
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
typedef long long LL;
multiset<LL> S;
S.insert(1e18), S.insert(-1e18);
for(int i = 0, j = 0; i < nums.size(); i ++){
if(i - j > k) S.erase(S.find(nums[j ++]));
int x = nums[i];
auto it = S.lower_bound(x);
if(*it - x <= t) return true;
it --;
if(x - * it <= t) return true;
S.insert(x);
}
return false;
}
};