目录
题目
给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
找出满足下述条件的下标对 (i, j):
i != j,
abs(i - j) <= indexDiff
abs(nums[i] - nums[j]) <= valueDiff
如果存在,返回 true ;否则,返回 false 。
解法
cpp
#define LL long long
class Solution {
public:
LL size;
bool containsNearbyAlmostDuplicate(vector <int> & nums, int k, int t) {
int n = nums.size();
unordered_map<LL, LL> m;
size = t + 1L;
for (int i = 0; i < n; i++) {
LL u = nums[i] * 1L;
LL idx = getIdx(u);
// 目标桶已存在(桶不为空),说明前面已有 [u - t, u + t] 范围的数字
if (m.find(idx) != m.end()) return true;
// 检查相邻的桶
LL l = idx - 1, r = idx + 1;
if (m.find(l) != m.end() && abs(u - m[l]) <= t) return true;
if (m.find(r) != m.end() && abs(u - m[r]) <= t) return true;
// 建立目标桶
m.insert({idx, u});
// 移除下标范围不在 [max(0, i - k), i) 内的桶
if (i >= k) m.erase(getIdx(nums[i - k]));
}
return false;
}
LL getIdx(LL u) {
return u >= 0 ? u / size : ((u + 1) / size) - 1;
}
};
桶排序用于查找一个范围内的元素,这个范围就相当于桶的大小。