Sliding Window
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { TreeSet<Integer> windowTreeSet = new TreeSet<>(); for (int i = 0; i < nums.length; i++) { Integer floor = windowTreeSet.floor(nums[i]); if (floor != null && nums[i] - (long) floor <= t) { return true; } Integer ceiling = windowTreeSet.ceiling(nums[i]); if (ceiling != null && (long) ceiling - nums[i] <= t) { return true; }
windowTreeSet.add(nums[i]); if (i >= k) { windowTreeSet.remove(nums[i - k]); } }
return false; } }
|
Bucket Sort
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { int bucketSize = t + 1;
Map<Integer, Integer> bucketIndexToValueMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) { int bucketIndex = getBucketIndex(nums[i], bucketSize); if (bucketIndexToValueMap.containsKey(bucketIndex)) { return true; }
Integer prevBucketValue = bucketIndexToValueMap.get(bucketIndex - 1); if (prevBucketValue != null && (long) nums[i] - prevBucketValue <= t) { return true; } Integer nextBucketValue = bucketIndexToValueMap.get(bucketIndex + 1); if (nextBucketValue != null && nextBucketValue - (long) nums[i] <= t) { return true; }
bucketIndexToValueMap.put(bucketIndex, nums[i]); if (i >= k) { bucketIndexToValueMap.remove(getBucketIndex(nums[i - k], bucketSize)); } }
return false; }
private int getBucketIndex(int num, int bucketSize) { if (num >= 0) { return num / bucketSize; } else { return (num + 1) / bucketSize - 1; } } }
|
References
220. Contains Duplicate III
剑指 Offer II 057. 值和下标之差都在给定的范围内