Skip to content

Commit 78deb21

Browse files
author
rchen102
committed
2020/07/13
1 parent ea2a15c commit 78deb21

File tree

3 files changed

+127
-68
lines changed

3 files changed

+127
-68
lines changed

Java/leetcode 219.java

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
1-
// Solution1: HashMap
2-
// T: O(n) S: O(n)(worst)
1+
// Solution1: HashSet + Sliding Window
2+
// T: O(n) S: O(k)
33
class Solution {
44
public boolean containsNearbyDuplicate(int[] nums, int k) {
5-
if (nums == null || nums.length == 0 || k <= 0) return false;
6-
HashMap<Integer, Integer> map = new HashMap<>();
5+
if (nums == null || nums.length == 0) return false;
6+
// helper variables
7+
Set<Integer> set = new HashSet<>();
8+
9+
// sliding window
10+
int windowLen = k + 1;
711
for (int i = 0; i < nums.length; i++) {
8-
if (!map.containsKey(nums[i])) map.put(nums[i], i);
9-
else {
10-
int prevIdx = map.get(nums[i]);
11-
if (Math.abs(prevIdx - i) <= k) return true;
12-
map.put(nums[i], i);
12+
// remove element
13+
if (i >= windowLen) {
14+
int leave = nums[i-windowLen];
15+
set.remove(new Integer(leave));
1316
}
17+
18+
// insert element
19+
int n = nums[i];
20+
if (!set.add(n)) return true;
1421
}
1522
return false;
1623
}
1724
}
1825

1926
// Solution2: HashSet + Sliding Window
27+
// 没用使用模板
2028
// T: O(n) S: O(k)
2129
class Solution {
2230
public boolean containsNearbyDuplicate(int[] nums, int k) {
@@ -28,4 +36,22 @@ public boolean containsNearbyDuplicate(int[] nums, int k) {
2836
}
2937
return false;
3038
}
39+
}
40+
41+
// Solution3: HashMap
42+
// T: O(n) S: O(n)(worst)
43+
class Solution {
44+
public boolean containsNearbyDuplicate(int[] nums, int k) {
45+
if (nums == null || nums.length == 0 || k <= 0) return false;
46+
HashMap<Integer, Integer> map = new HashMap<>();
47+
for (int i = 0; i < nums.length; i++) {
48+
if (!map.containsKey(nums[i])) map.put(nums[i], i);
49+
else {
50+
int prevIdx = map.get(nums[i]);
51+
if (Math.abs(prevIdx - i) <= k) return true;
52+
map.put(nums[i], i);
53+
}
54+
}
55+
return false;
56+
}
3157
}

Java/leetcode 239.java

Lines changed: 43 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,60 @@
1-
//Own solution1: T: O(n*k) S: O(n)
1+
// Solution1: sliding window + Deque
2+
// T: O(n) S: O(k)
23
class Solution {
34
public int[] maxSlidingWindow(int[] nums, int k) {
4-
if(nums == null) return null;
5-
int len = nums.length;
6-
if(len < 1) return new int[0];
7-
5+
if (nums == null || nums.length == 0) return null;
6+
// helper variables
87
int[] res = new int[nums.length - k + 1];
9-
for(int i = 0; i <= nums.length - k; i++) {
10-
res[i] = getMax(nums, i, k);
11-
}
12-
return res;
13-
}
14-
15-
private int getMax(int[] nums, int start, int k) {
16-
int max = nums[start];
17-
for(int j = start + 1; j < start + k; j++) {
18-
max = (max > nums[j] ? max : nums[j]);
19-
}
20-
return max;
21-
}
22-
}
23-
24-
//Own solution2: T: worst: O(nk) S: O(n)
25-
class Solution {
26-
public int[] maxSlidingWindow(int[] nums, int k) {
27-
if(nums == null) return null;
28-
int len = nums.length;
29-
if(len < 1) return new int[0];
8+
Deque<Integer> queue = new LinkedList<>();
309

31-
int[] res = new int[nums.length - k + 1];
32-
res[0] = getMax(nums, 0, k);
33-
int max = res[0];
34-
35-
for(int i = 1; i <= nums.length - k; i++) {
36-
if(nums[i + k -1] > nums[i-1]) max = Math.max(nums[i + k - 1], max);
37-
else if(max == nums[i-1]) max = getMax(nums, i, k);
38-
res[i] = max;
10+
// sliding window
11+
int windowLen = k;
12+
int cur = 0;
13+
for (int i = 0; i < nums.length; i++) {
14+
int n = nums[i];
15+
// insert to window
16+
while (!queue.isEmpty() && nums[queue.peekLast()] <= n) {
17+
queue.pollLast();
18+
}
19+
queue.offerLast(i);
20+
// leave window
21+
if (i >= windowLen) {
22+
if (!queue.isEmpty() && queue.peekFirst() <= i - windowLen) queue.pollFirst();
23+
}
24+
// update
25+
if (i == k - 1 || i >= windowLen) {
26+
res[cur] = nums[queue.peekFirst()];
27+
cur++;
28+
}
3929
}
4030
return res;
4131
}
42-
43-
private int getMax(int[] nums, int start, int k) {
44-
int max = nums[start];
45-
for(int j = start + 1; j < start + k; j++) {
46-
max = (max > nums[j] ? max : nums[j]);
47-
}
48-
return max;
49-
}
5032
}
5133

52-
//Best solution: deque T: O(n) S: O(k)
34+
// Solution2: sliding window + heap
35+
// 超时
5336
class Solution {
5437
public int[] maxSlidingWindow(int[] nums, int k) {
55-
int len = nums.length;
56-
if(len < 1) return nums;
38+
if (nums == null || nums.length == 0) return null;
39+
// helper variables
40+
List<Integer> res = new ArrayList<>();
41+
PriorityQueue<Integer> heap = new PriorityQueue<>(k + 1, (a, b) -> b - a);
5742

58-
int[] res = new int[len - k + 1];
59-
Deque<Integer> dq = new LinkedList<>();
60-
for(int i = 0; i < len; i++) {
61-
if(!dq.isEmpty() && dq.peek() < i - k + 1) {
62-
dq.poll();
43+
// sliding window
44+
int windowLen = k;
45+
for (int i = 0; i < nums.length; i++) {
46+
int n = nums[i];
47+
heap.add(n);
48+
49+
if (i >= windowLen) {
50+
int leave = nums[i - windowLen];
51+
heap.remove(new Integer(leave)); // O(k)
6352
}
64-
while(!dq.isEmpty() && nums[dq.peekLast()] <= nums[i]) {
65-
dq.pollLast();
66-
}
67-
dq.offer(i);
68-
if(i - k + 1 >= 0) {
69-
res[i - k + 1] = nums[dq.peek()];
53+
54+
if (i == k - 1 || i >= windowLen) {
55+
res.add(heap.peek());
7056
}
7157
}
72-
return res;
58+
return res.stream().mapToInt(Integer :: valueOf).toArray();
7359
}
7460
}

Java/leetcode 567.java

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// Solution1: sliding window T: O(n) S: O(1)
1+
// Solution1: sliding window
2+
// Array + isAllZero,固定滑动窗口模板
3+
// T: O(n) S: O(1)
24
class Solution {
35
public boolean checkInclusion(String s1, String s2) {
46
if (s2 == null || s2.length() == 0 || s1 == null || s1.length() == 0) return false;
@@ -30,7 +32,9 @@ private boolean isAllZero(int[] code) {
3032
}
3133
}
3234

33-
// Solution1: sliding window T: O(n) S: O(n)
35+
// Solution2: sliding window
36+
// Array + isAllZero,经典滑动窗口模板
37+
// T: O(n) S: O(1)
3438
class Solution {
3539
public boolean checkInclusion(String s1, String s2) {
3640
if (s2 == null || s2.length() == 0 || s1 == null || s1.length() == 0) return false;
@@ -66,3 +70,46 @@ public boolean checkInclusion(String s1, String s2) {
6670
}
6771
}
6872

73+
// Solution3: sliding window
74+
// HashMap + valid,经典滑动窗口模板
75+
// T: O(n) S: O(1)
76+
class Solution {
77+
public boolean checkInclusion(String s1, String s2) {
78+
if (s2 == null || s2.length() == 0 || s1 == null || s1.length() == 0) return false;
79+
// helper variables
80+
Map<Character, Integer> need = new HashMap<>();
81+
Map<Character, Integer> window = new HashMap<>();
82+
83+
for (char ch : s1.toCharArray()) {
84+
need.put(ch, need.getOrDefault(ch, 0) + 1);
85+
}
86+
int valid = 0;
87+
88+
// sliding window
89+
int left = 0, right = 0;
90+
boolean isNeedShrink = false;
91+
while (right < s2.length()) {
92+
char ch = s2.charAt(right);
93+
right++;
94+
95+
if (need.containsKey(ch)) {
96+
window.put(ch, window.getOrDefault(ch, 0) + 1);
97+
if ((int) window.get(ch) == (int) need.get(ch)) valid++;
98+
if (valid == need.size()) return true;
99+
}
100+
if (right - left >= s1.length()) isNeedShrink = true;
101+
102+
while (isNeedShrink) {
103+
char leave = s2.charAt(left);
104+
left++;
105+
106+
if (need.containsKey(leave)) {
107+
if ((int) window.get(leave) == (int) need.get(leave)) valid--;
108+
window.put(leave, window.getOrDefault(leave, 0) - 1);
109+
}
110+
if (right - left < s1.length()) isNeedShrink = false;
111+
}
112+
}
113+
return false;
114+
}
115+
}

0 commit comments

Comments
 (0)