https://leetcode-cn.com/problems/contains-duplicate-iii/
方法1
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if (t<0 || k ==0) return false;
set<long> set_;
for (int i = 0; i < nums.size(); ++i)
{
auto it = set_.lower_bound((long)nums[i]-t);
if (it != set_.end() && *it <= (long)nums[i]+t) return true;
set_.insert(nums[i]);
// set中不会存在相同元素,否则已经满足条件,return true了
if (i >= k) set_.erase(nums[i-k]);
}
return false;
}
};
方法2 桶
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if (t<0 || k ==0) return false;
unordered_map<long,long> d;
long w = (long)t + 1;
for (int i = 0; i < nums.size(); ++i)
{
long id = getID(nums[i],w);
if (d.count(id)) return true;
if (d.count(id-1) && nums[i] - d[id-1] < w) return true;
if (d.count(id+1) && d[id+1] - nums[i] < w) return true;
d[id] = nums[i];
if (i >= k) d.erase(getID(nums[i-k],w));
}
return false;
}
long getID(long x, long w)
{
return x<0?((x+1)/w-1):x/w;
}
};