forked from anishLearnsToCode/leetcode-algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ContainsDuplicateIII.java
34 lines (27 loc) · 1010 Bytes
/
ContainsDuplicateIII.java
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
// https://leetcode.com/problems/contains-duplicate-iii
// T: O(N)
// S: O(N)
import java.util.HashMap;
import java.util.Map;
public class ContainsDuplicateIII {
private long getID(long i, long w) {
return i < 0 ? (i + 1) / w - 1 : i / w;
}
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (k == 0) return false;
final Map<Long, Long> buckets = new HashMap<>();
final long w = (long) t + 1;
for (int i = 0; i < nums.length; ++i) {
long m = getID(nums[i], w);
if (buckets.containsKey(m))
return true;
if (buckets.containsKey(m - 1) && Math.abs(nums[i] - buckets.get(m - 1)) < w)
return true;
if (buckets.containsKey(m + 1) && Math.abs(nums[i] - buckets.get(m + 1)) < w)
return true;
buckets.put(m, (long)nums[i]);
if (i >= k) buckets.remove(getID(nums[i - k], w));
}
return false;
}
}