Skip to content

Commit 7d6fbe2

Browse files
committed
Runtime: 52 ms (Top 75.62%) | Memory: 55.00 MB (Top 92.14%)
1 parent a745b9b commit 7d6fbe2

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Runtime: 52 ms (Top 75.62%) | Memory: 55.00 MB (Top 92.14%)
2+
3+
/**
4+
* Sliding Window solution using Buckets
5+
*
6+
* Time Complexity: O(N)
7+
*
8+
* Space Complexity: O(min(N, K+1))
9+
*
10+
* N = Length of input array. K = Input difference between indexes.
11+
*/
12+
class Solution {
13+
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
14+
if (nums == null || nums.length < 2 || k < 1 || t < 0) {
15+
return false;
16+
}
17+
18+
HashMap<Long, Long> buckets = new HashMap<>();
19+
// The bucket size is t+1 as the ranges are from 0..t, t+1..2t+1, ..
20+
long bucketSize = (long) t + 1;
21+
22+
for (int i = 0; i < nums.length; i++) {
23+
// Making sure only K buckets exists in map.
24+
if (i > k) {
25+
long lastBucket = ((long) nums[i - k - 1] - Integer.MIN_VALUE) / bucketSize;
26+
buckets.remove(lastBucket);
27+
}
28+
29+
long remappedNum = (long) nums[i] - Integer.MIN_VALUE;
30+
long bucket = remappedNum / bucketSize;
31+
32+
// If 2 numbers belong to same bucket
33+
if (buckets.containsKey(bucket)) {
34+
return true;
35+
}
36+
37+
// If numbers are in adjacent buckets and the difference between them is at most
38+
// t.
39+
if (buckets.containsKey(bucket - 1) && remappedNum - buckets.get(bucket - 1) <= t) {
40+
return true;
41+
}
42+
if (buckets.containsKey(bucket + 1) && buckets.get(bucket + 1) - remappedNum <= t) {
43+
return true;
44+
}
45+
46+
buckets.put(bucket, remappedNum);
47+
}
48+
49+
return false;
50+
}
51+
}

0 commit comments

Comments
 (0)