Leetcode220,给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
桶和滑动的思想;
如果在K的范围内滑动的桶,按照nums[i]/(t+1)建立分类;
然后如果当前移动位置已经大于K,那么要把滑窗头给擦除
1、对新增的数据,如果桶里面有东西,那么一定是TRUE
2、如果上个桶有东西,且满足T的要求,那么一定是TRUE
3、如果下个桶有东西,且满足T的要求,那么一定是TRUE
其他情况都不满足
class Solution
{
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t)
{
unordered_map<long long, long long> mp;
long long bucketlen = (long long)t + 1;
long long index;
int n = nums.size();
for (int i = 0; i < n; i ++)
{
if (i > k)
{
index = nums[i-k-1] / bucketlen;
if (nums[i-k-1] < 0) {
index--;
}
mp.erase(index);
}
index = nums[i] / bucketlen;
if (nums[i] < 0) {
index--;
}
if (mp.count(index)) return true;
if (mp.count(index-1) && abs((long long)nums[mp[index-1]] - nums[i]) <= t) {
return true;
}
if (mp.count(index+1) && abs((long long)nums[mp[index+1]] - nums[i]) <= t) {
return true;
}
mp[index] = i;
}
return false;
}
};