Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 206d381

Browse files
solves contains duplicate iii in java
1 parent 74f637d commit 206d381

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

src/ContainsDuplicateIII.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import java.util.TreeMap;
2+
3+
public class ContainsDuplicateIII {
4+
5+
public boolean containsNearbyAlmostDuplicate(int[] array, int k, int t) {
6+
// no memory
7+
if (k == 0) return false;
8+
9+
final TreeMap<Long, Integer> elements = new TreeMap<>();
10+
for (int i = 0 ; i < array.length ; i++) {
11+
long lowerBound = (long) array[i] - t;
12+
long upperBound = (long) array[i] + t;
13+
long lowerClosest = getClosestOrHigher(elements, lowerBound);
14+
if (inRange(lowerClosest, lowerBound, upperBound)) return true;
15+
long upperClosest = getClosestOrLower(elements, upperBound);
16+
if (inRange(upperClosest, lowerBound, upperBound)) return true;
17+
if (i >= k) {
18+
removeFromMap(elements, array[i - k]);
19+
}
20+
addToMap(elements, array[i]);
21+
}
22+
23+
return false;
24+
}
25+
26+
private void removeFromMap(TreeMap<Long, Integer> elements, long val) {
27+
if (elements.get(val) == 1) {
28+
elements.remove(val);
29+
} else {
30+
elements.put(val, elements.get(val) - 1);
31+
}
32+
}
33+
34+
private void addToMap(TreeMap<Long, Integer> elements, long val) {
35+
elements.put(val, elements.getOrDefault(val, 0) + 1);
36+
}
37+
38+
private long getClosestOrHigher(TreeMap<Long, Integer> elements, long val) {
39+
Long lowerClosest = elements.ceilingKey(val);
40+
return lowerClosest == null ? Long.MAX_VALUE : lowerClosest;
41+
}
42+
43+
private long getClosestOrLower(TreeMap<Long, Integer> elements, long val) {
44+
Long upperClosest = elements.floorKey(val);
45+
return upperClosest == null ? Long.MIN_VALUE : upperClosest;
46+
}
47+
48+
private boolean inRange(long val, long low, long high) {
49+
return low <= val && val <= high;
50+
}
51+
}

0 commit comments

Comments
 (0)