难度:中等
在整数数组
nums
中,是否存在两个下标 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ,且满足 i 和 j 的差的绝对值也小于等于 ķ 。如果存在则返回
true
,不存在返回false
。示例 1:
输入: nums = [1,2,3,1], k = 3, t = 0 输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1, t = 2 输出: true
示例 3:
输入: nums = [1,5,9,1,5,9], k = 2, t = 3 输出: false
分析:
桶排序,详见👇
代码:
class Solution {
private long getID(int x, long w) {
return x<0 ? (x+1)/w-1 : x/w;
}
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if(t < 0)
return false;
Map<Long,Long> map = new HashMap<>();
long w = (long)t+1;
for (int i = 0; i < nums.length; i++) {
long m = getID(nums[i],w);
if(map.containsKey(m))
return true;
if(map.containsKey(m-1) && Math.abs(nums[i]-map.get(m-1)) < w)
return true;
if(map.containsKey(m+1) && Math.abs(nums[i]-map.get(m+1)) < w)
return true;
map.put(m,(long)nums[i]);
if(i>=k) map.remove(getID(nums[i-k],w));
}
return false;
}
}
结果: