Skip to content

Commit ce05895

Browse files
committed
feat: add solutions to lc problem: No.0239.Sliding Window Maximum
1 parent c3386dc commit ce05895

File tree

9 files changed

+266
-37
lines changed

9 files changed

+266
-37
lines changed

lcof/面试题59 - I. 滑动窗口的最大值/README.md

+19-7
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,20 @@
3333

3434
<!-- 这里可写通用的实现逻辑 -->
3535

36-
双端队列实现。
36+
单调队列。
37+
38+
单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:
39+
40+
```python
41+
q = deque()
42+
for i in range(n):
43+
# 判断队头是否滑出窗口
44+
while q and checkout_out(q[0]):
45+
q.popleft()
46+
while q and check(q[-1]):
47+
q.pop()
48+
q.append(i)
49+
```
3750

3851
<!-- tabs:start -->
3952

@@ -44,14 +57,13 @@
4457
```python
4558
class Solution:
4659
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
47-
q, res = [], []
60+
q, res = collections.deque(), []
4861
for i, num in enumerate(nums):
49-
while len(q) != 0 and nums[q[-1]] <= num:
50-
q.pop(-1)
62+
if q and i - k + 1 > q[0]:
63+
q.popleft()
64+
while q and nums[q[-1]] <= num:
65+
q.pop()
5166
q.append(i)
52-
53-
if q[0] == i - k:
54-
q = q[1:]
5567
if i >= k - 1:
5668
res.append(nums[q[0]])
5769
return res

lcof/面试题59 - I. 滑动窗口的最大值/Solution.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
class Solution {
22
public int[] maxSlidingWindow(int[] nums, int k) {
3-
int index = 0, n = nums.length;
4-
if (k == 0 || n == 0) {
3+
int n = nums.length;
4+
if (n == 0) {
55
return new int[0];
66
}
77
int[] res = new int[n - k + 1];
8-
LinkedList<Integer> q = new LinkedList<>();
9-
for (int i = 0; i < n; ++i) {
8+
Deque<Integer> q = new LinkedList<>();
9+
for (int i = 0, j = 0; i < n; ++i) {
10+
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
11+
q.pollFirst();
12+
}
1013
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
1114
q.pollLast();
1215
}
13-
q.addLast(i);
14-
if (q.peekFirst() == i - k) {
15-
q.pollFirst();
16-
}
16+
q.offerLast(i);
1717
if (i >= k - 1) {
18-
res[index++] = nums[q.peekFirst()];
18+
res[j++] = nums[q.peekFirst()];
1919
}
2020
}
2121
return res;
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
class Solution:
22
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
3-
q, res = [], []
3+
q, res = collections.deque(), []
44
for i, num in enumerate(nums):
5-
while len(q) != 0 and nums[q[-1]] <= num:
6-
q.pop(-1)
5+
if q and i - k + 1 > q[0]:
6+
q.popleft()
7+
while q and nums[q[-1]] <= num:
8+
q.pop()
79
q.append(i)
8-
9-
if q[0] == i - k:
10-
q = q[1:]
1110
if i >= k - 1:
1211
res.append(nums[q[0]])
1312
return res

solution/0200-0299/0239.Sliding Window Maximum/README.md

+95-2
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,70 @@
7070

7171
<!-- 这里可写通用的实现逻辑 -->
7272

73+
单调队列。
74+
75+
单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:
76+
77+
```python
78+
q = deque()
79+
for i in range(n):
80+
# 判断队头是否滑出窗口
81+
while q and checkout_out(q[0]):
82+
q.popleft()
83+
while q and check(q[-1]):
84+
q.pop()
85+
q.append(i)
86+
```
87+
7388
<!-- tabs:start -->
7489

7590
### **Python3**
7691

7792
<!-- 这里可写当前语言的特殊实现逻辑 -->
7893

7994
```python
80-
95+
class Solution:
96+
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
97+
q, res = collections.deque(), []
98+
for i, num in enumerate(nums):
99+
if q and i - k + 1 > q[0]:
100+
q.popleft()
101+
while q and nums[q[-1]] <= num:
102+
q.pop()
103+
q.append(i)
104+
if i >= k - 1:
105+
res.append(nums[q[0]])
106+
return res
81107
```
82108

83109
### **Java**
84110

85111
<!-- 这里可写当前语言的特殊实现逻辑 -->
86112

87113
```java
88-
114+
class Solution {
115+
public int[] maxSlidingWindow(int[] nums, int k) {
116+
int n = nums.length;
117+
if (n == 0) {
118+
return new int[0];
119+
}
120+
int[] res = new int[n - k + 1];
121+
Deque<Integer> q = new LinkedList<>();
122+
for (int i = 0, j = 0; i < n; ++i) {
123+
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
124+
q.pollFirst();
125+
}
126+
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
127+
q.pollLast();
128+
}
129+
q.offerLast(i);
130+
if (i >= k - 1) {
131+
res[j++] = nums[q.peekFirst()];
132+
}
133+
}
134+
return res;
135+
}
136+
}
89137
```
90138

91139
### **JavaScript**
@@ -118,6 +166,51 @@ var maxSlidingWindow = function (nums, k) {
118166
};
119167
```
120168

169+
### **C++**
170+
171+
```cpp
172+
class Solution {
173+
public:
174+
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
175+
vector<int> res;
176+
deque<int> q;
177+
for (int i = 0; i < nums.size(); ++i)
178+
{
179+
if (!q.empty() && i - k + 1 > q.front())
180+
q.pop_front();
181+
while (!q.empty() && nums[q.back()] <= nums[i])
182+
q.pop_back();
183+
q.push_back(i);
184+
if (i >= k - 1)
185+
res.push_back(nums[q.front()]);
186+
}
187+
return res;
188+
}
189+
};
190+
```
191+
192+
### **Go**
193+
194+
```go
195+
func maxSlidingWindow(nums []int, k int) []int {
196+
var res []int
197+
var q []int
198+
for i, num := range nums {
199+
if len(q) > 0 && i-k+1 > q[0] {
200+
q = q[1:]
201+
}
202+
for len(q) > 0 && nums[q[len(q)-1]] <= num {
203+
q = q[:len(q)-1]
204+
}
205+
q = append(q, i)
206+
if i >= k-1 {
207+
res = append(res, nums[q[0]])
208+
}
209+
}
210+
return res
211+
}
212+
```
213+
121214
### **...**
122215

123216
```

solution/0200-0299/0239.Sliding Window Maximum/README_EN.md

+80-2
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,46 @@ Window position Max
7070
### **Python3**
7171

7272
```python
73-
73+
class Solution:
74+
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
75+
q, res = collections.deque(), []
76+
for i, num in enumerate(nums):
77+
if q and i - k + 1 > q[0]:
78+
q.popleft()
79+
while q and nums[q[-1]] <= num:
80+
q.pop()
81+
q.append(i)
82+
if i >= k - 1:
83+
res.append(nums[q[0]])
84+
return res
7485
```
7586

7687
### **Java**
7788

7889
```java
79-
90+
class Solution {
91+
public int[] maxSlidingWindow(int[] nums, int k) {
92+
int n = nums.length;
93+
if (n == 0) {
94+
return new int[0];
95+
}
96+
int[] res = new int[n - k + 1];
97+
Deque<Integer> q = new LinkedList<>();
98+
for (int i = 0, j = 0; i < n; ++i) {
99+
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
100+
q.pollFirst();
101+
}
102+
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
103+
q.pollLast();
104+
}
105+
q.offerLast(i);
106+
if (i >= k - 1) {
107+
res[j++] = nums[q.peekFirst()];
108+
}
109+
}
110+
return res;
111+
}
112+
}
80113
```
81114

82115
### **JavaScript**
@@ -109,6 +142,51 @@ var maxSlidingWindow = function (nums, k) {
109142
};
110143
```
111144

145+
### **C++**
146+
147+
```cpp
148+
class Solution {
149+
public:
150+
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
151+
vector<int> res;
152+
deque<int> q;
153+
for (int i = 0; i < nums.size(); ++i)
154+
{
155+
if (!q.empty() && i - k + 1 > q.front())
156+
q.pop_front();
157+
while (!q.empty() && nums[q.back()] <= nums[i])
158+
q.pop_back();
159+
q.push_back(i);
160+
if (i >= k - 1)
161+
res.push_back(nums[q.front()]);
162+
}
163+
return res;
164+
}
165+
};
166+
```
167+
168+
### **Go**
169+
170+
```go
171+
func maxSlidingWindow(nums []int, k int) []int {
172+
var res []int
173+
var q []int
174+
for i, num := range nums {
175+
if len(q) > 0 && i-k+1 > q[0] {
176+
q = q[1:]
177+
}
178+
for len(q) > 0 && nums[q[len(q)-1]] <= num {
179+
q = q[:len(q)-1]
180+
}
181+
q = append(q, i)
182+
if i >= k-1 {
183+
res = append(res, nums[q[0]])
184+
}
185+
}
186+
return res
187+
}
188+
```
189+
112190
### **...**
113191

114192
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
4+
vector<int> res;
5+
deque<int> q;
6+
for (int i = 0; i < nums.size(); ++i)
7+
{
8+
if (!q.empty() && i - k + 1 > q.front())
9+
q.pop_front();
10+
while (!q.empty() && nums[q.back()] <= nums[i])
11+
q.pop_back();
12+
q.push_back(i);
13+
if (i >= k - 1)
14+
res.push_back(nums[q.front()]);
15+
}
16+
return res;
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
func maxSlidingWindow(nums []int, k int) []int {
2+
var res []int
3+
var q []int
4+
for i, num := range nums {
5+
if len(q) > 0 && i-k+1 > q[0] {
6+
q = q[1:]
7+
}
8+
for len(q) > 0 && nums[q[len(q)-1]] <= num {
9+
q = q[:len(q)-1]
10+
}
11+
q = append(q, i)
12+
if i >= k-1 {
13+
res = append(res, nums[q[0]])
14+
}
15+
}
16+
return res
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
class Solution {
22
public int[] maxSlidingWindow(int[] nums, int k) {
3-
if (nums == null || nums.length == 0 || k <= 0) {
3+
int n = nums.length;
4+
if (n == 0) {
45
return new int[0];
56
}
6-
int[] res = new int[nums.length - k + 1];
7-
int index = 0;
8-
Deque<Integer> q = new ArrayDeque<>(k);
9-
for (int i = 0; i < nums.length; ++i) {
10-
while (!q.isEmpty() && nums[i] >= nums[q.peekLast()]) {
7+
int[] res = new int[n - k + 1];
8+
Deque<Integer> q = new LinkedList<>();
9+
for (int i = 0, j = 0; i < n; ++i) {
10+
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
11+
q.pollFirst();
12+
}
13+
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
1114
q.pollLast();
1215
}
1316
q.offerLast(i);
14-
if (i - q.peekFirst() >= k) {
15-
q.pollFirst();
16-
}
1717
if (i >= k - 1) {
18-
res[index++] = nums[q.peekFirst()];
18+
res[j++] = nums[q.peekFirst()];
1919
}
2020
}
2121
return res;
2222
}
23-
}
23+
}

0 commit comments

Comments
 (0)