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

Commit 88cdd6b

Browse files
solves contains duplicate iii in java
1 parent 206d381 commit 88cdd6b

File tree

2 files changed

+25
-42
lines changed

2 files changed

+25
-42
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
| 216 | [Combination Sum III](https://leetcode.com/problems/combination-sum-iii) | [![Java](assets/java.png)](src/CombinationSumIII.java) | |
178178
| 217 | [Contains Duplicate](https://leetcode.com/problems/contains-duplicate) | [![Java](assets/java.png)](src/ContainsDuplicate.java) [![Python](assets/python.png)](python/contains_duplicate.py) | |
179179
| 219 | [Contains Duplicate II](https://leetcode.com/problems/contains-duplicate-ii) | [![Java](assets/java.png)](src/ContainsDuplicateII.java) [![Python](assets/python.png)](python/contains_duplicate_ii.py) | |
180-
| 220 | [Contains Duplicate III](https://leetcode.com/problems/contains-duplicate-iii) | | |
180+
| 220 | [Contains Duplicate III](https://leetcode.com/problems/contains-duplicate-iii) | [![Java](assets/java.png)](src/ContainsDuplicateIII.java) | |
181181
| 221 | [Maximal Square](https://leetcode.com/problems/maximal-square) | | |
182182
| 222 | [Count Complete Tree Nodes](https://leetcode.com/problems/count-complete-tree-nodes) | [![Java](assets/java.png)](src/CountCompleteTreeNodes.java) | |
183183
| 223 | [Rectangle Area](https://leetcode.com/problems/rectangle-area) | | |

src/ContainsDuplicateIII.java

Lines changed: 24 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,34 @@
1-
import java.util.TreeMap;
1+
// https://leetcode.com/problems/contains-duplicate-iii
2+
// T: O(N)
3+
// S: O(N)
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
27

38
public class ContainsDuplicateIII {
49

5-
public boolean containsNearbyAlmostDuplicate(int[] array, int k, int t) {
6-
// no memory
10+
private long getID(long i, long w) {
11+
return i < 0 ? (i + 1) / w - 1 : i / w;
12+
}
13+
14+
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
715
if (k == 0) return false;
816

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]);
17+
final Map<Long, Long> buckets = new HashMap<>();
18+
final long w = (long) t + 1;
19+
20+
for (int i = 0; i < nums.length; ++i) {
21+
long m = getID(nums[i], w);
22+
if (buckets.containsKey(m))
23+
return true;
24+
if (buckets.containsKey(m - 1) && Math.abs(nums[i] - buckets.get(m - 1)) < w)
25+
return true;
26+
if (buckets.containsKey(m + 1) && Math.abs(nums[i] - buckets.get(m + 1)) < w)
27+
return true;
28+
buckets.put(m, (long)nums[i]);
29+
if (i >= k) buckets.remove(getID(nums[i - k], w));
2130
}
2231

2332
return false;
2433
}
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-
}
5134
}

0 commit comments

Comments
 (0)