Skip to content

Commit 3028770

Browse files
committedMay 15, 2022
feat: update solutions to lc problem: No.0239
No.0239.Sliding Window Maximum
1 parent defa442 commit 3028770

File tree

12 files changed

+129
-154
lines changed

12 files changed

+129
-154
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
- [设计链表](/solution/0700-0799/0707.Design%20Linked%20List/README.md) - `单链表``指针引用``数组实现`
5757
- [下一个更大元素 I](/solution/0400-0499/0496.Next%20Greater%20Element%20I/README.md) - `单调栈`
5858
- [每日温度](/solution/0700-0799/0739.Daily%20Temperatures/README.md) - `单调栈`
59+
- [滑动窗口最大值](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README.md) - `单调队列`
5960

6061
### 3. 搜索
6162

‎README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
5454
- [Design Linked List](/solution/0700-0799/0707.Design%20Linked%20List/README_EN.md) - `Linked List`, `Pointer`, `Array`
5555
- [Next Greater Element I](/solution/0400-0499/0496.Next%20Greater%20Element%20I/README_EN.md) - `Monotonic Stack`
5656
- [Daily Temperatures](/solution/0700-0799/0739.Daily%20Temperatures/README_EN.md) - `Monotonic Stack`
57+
- [Sliding Window Maximum](/solution/0200-0299/0239.Sliding%20Window%20Maximum/README_EN.md) - `Monotonic Queue`
5758

5859
### 3. Search
5960

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

+43-51
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
<!-- 这里可写通用的实现逻辑 -->
5151

52-
单调队列
52+
**方法一:单调队列**
5353

5454
单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:
5555

@@ -73,16 +73,17 @@ for i in range(n):
7373
```python
7474
class Solution:
7575
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
76-
q, res = deque(), []
77-
for i, num in enumerate(nums):
76+
q = deque()
77+
ans = []
78+
for i, v in enumerate(nums):
7879
if q and i - k + 1 > q[0]:
7980
q.popleft()
80-
while q and nums[q[-1]] <= num:
81+
while q and nums[q[-1]] <= v:
8182
q.pop()
8283
q.append(i)
8384
if i >= k - 1:
84-
res.append(nums[q[0]])
85-
return res
85+
ans.append(nums[q[0]])
86+
return ans
8687
```
8788

8889
### **Java**
@@ -93,24 +94,21 @@ class Solution:
9394
class Solution {
9495
public int[] maxSlidingWindow(int[] nums, int k) {
9596
int n = nums.length;
96-
if (n == 0) {
97-
return new int[0];
98-
}
99-
int[] res = new int[n - k + 1];
100-
Deque<Integer> q = new LinkedList<>();
97+
int[] ans = new int[n - k + 1];
98+
Deque<Integer> q = new ArrayDeque<>();
10199
for (int i = 0, j = 0; i < n; ++i) {
102100
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
103101
q.pollFirst();
104102
}
105103
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
106104
q.pollLast();
107105
}
108-
q.offerLast(i);
106+
q.offer(i);
109107
if (i >= k - 1) {
110-
res[j++] = nums[q.peekFirst()];
108+
ans[j++] = nums[q.peekFirst()];
111109
}
112110
}
113-
return res;
111+
return ans;
114112
}
115113
}
116114
```
@@ -124,24 +122,21 @@ class Solution {
124122
* @return {number[]}
125123
*/
126124
var maxSlidingWindow = function (nums, k) {
127-
let len = nums.length;
128-
if (len < k) return [];
129-
let res = [],
130-
win = [];
131-
for (let i = 0; i < k; i++) {
132-
while (win.length > 0 && nums[i] >= nums[win[win.length - 1]])
133-
win.pop();
134-
win.push(i);
135-
}
136-
res.push(nums[win[0]]);
137-
for (let i = k; i < len; i++) {
138-
while (win.length > 0 && nums[i] >= nums[win[win.length - 1]])
139-
win.pop();
140-
if (win.length > 0 && win[0] < i - k + 1) win.shift();
141-
win.push(i);
142-
res.push(nums[win[0]]);
125+
let ans = [];
126+
let q = [];
127+
for (let i = 0; i < nums.length; ++i) {
128+
if (q && i - k + 1 > q[0]) {
129+
q.shift();
130+
}
131+
while (q && nums[q[q.length - 1]] <= nums[i]) {
132+
q.pop();
133+
}
134+
q.push(i);
135+
if (i >= k - 1) {
136+
ans.push(nums[q[0]]);
137+
}
143138
}
144-
return res;
139+
return ans;
145140
};
146141
```
147142

@@ -150,43 +145,40 @@ var maxSlidingWindow = function (nums, k) {
150145
```cpp
151146
class Solution {
152147
public:
153-
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
154-
vector<int> res;
155-
deque<int> q;
156-
for (int i = 0; i < nums.size(); ++i)
157-
{
158-
if (!q.empty() && i - k + 1 > q.front())
159-
q.pop_front();
160-
while (!q.empty() && nums[q.back()] <= nums[i])
161-
q.pop_back();
162-
q.push_back(i);
163-
if (i >= k - 1)
164-
res.push_back(nums[q.front()]);
165-
}
166-
return res;
167-
}
148+
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
149+
deque<int> q;
150+
vector<int> ans;
151+
for (int i = 0; i < nums.size(); ++i)
152+
{
153+
if (!q.empty() && i - k + 1 > q.front()) q.pop_front();
154+
while (!q.empty() && nums[q.back()] <= nums[i]) q.pop_back();
155+
q.push_back(i);
156+
if (i >= k - 1) ans.push_back(nums[q.front()]);
157+
}
158+
return ans;
159+
}
168160
};
169161
```
170162
171163
### **Go**
172164
173165
```go
174166
func maxSlidingWindow(nums []int, k int) []int {
175-
var res []int
176167
var q []int
177-
for i, num := range nums {
168+
var ans []int
169+
for i, v := range nums {
178170
if len(q) > 0 && i-k+1 > q[0] {
179171
q = q[1:]
180172
}
181-
for len(q) > 0 && nums[q[len(q)-1]] <= num {
173+
for len(q) > 0 && nums[q[len(q)-1]] <= v {
182174
q = q[:len(q)-1]
183175
}
184176
q = append(q, i)
185177
if i >= k-1 {
186-
res = append(res, nums[q[0]])
178+
ans = append(ans, nums[q[0]])
187179
}
188180
}
189-
return res
181+
return ans
190182
}
191183
```
192184

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

+42-50
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,17 @@ Window position Max
5050
```python
5151
class Solution:
5252
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
53-
q, res = deque(), []
54-
for i, num in enumerate(nums):
53+
q = deque()
54+
ans = []
55+
for i, v in enumerate(nums):
5556
if q and i - k + 1 > q[0]:
5657
q.popleft()
57-
while q and nums[q[-1]] <= num:
58+
while q and nums[q[-1]] <= v:
5859
q.pop()
5960
q.append(i)
6061
if i >= k - 1:
61-
res.append(nums[q[0]])
62-
return res
62+
ans.append(nums[q[0]])
63+
return ans
6364
```
6465

6566
### **Java**
@@ -68,24 +69,21 @@ class Solution:
6869
class Solution {
6970
public int[] maxSlidingWindow(int[] nums, int k) {
7071
int n = nums.length;
71-
if (n == 0) {
72-
return new int[0];
73-
}
74-
int[] res = new int[n - k + 1];
75-
Deque<Integer> q = new LinkedList<>();
72+
int[] ans = new int[n - k + 1];
73+
Deque<Integer> q = new ArrayDeque<>();
7674
for (int i = 0, j = 0; i < n; ++i) {
7775
if (!q.isEmpty() && i - k + 1 > q.peekFirst()) {
7876
q.pollFirst();
7977
}
8078
while (!q.isEmpty() && nums[q.peekLast()] <= nums[i]) {
8179
q.pollLast();
8280
}
83-
q.offerLast(i);
81+
q.offer(i);
8482
if (i >= k - 1) {
85-
res[j++] = nums[q.peekFirst()];
83+
ans[j++] = nums[q.peekFirst()];
8684
}
8785
}
88-
return res;
86+
return ans;
8987
}
9088
}
9189
```
@@ -99,24 +97,21 @@ class Solution {
9997
* @return {number[]}
10098
*/
10199
var maxSlidingWindow = function (nums, k) {
102-
let len = nums.length;
103-
if (len < k) return [];
104-
let res = [],
105-
win = [];
106-
for (let i = 0; i < k; i++) {
107-
while (win.length > 0 && nums[i] >= nums[win[win.length - 1]])
108-
win.pop();
109-
win.push(i);
110-
}
111-
res.push(nums[win[0]]);
112-
for (let i = k; i < len; i++) {
113-
while (win.length > 0 && nums[i] >= nums[win[win.length - 1]])
114-
win.pop();
115-
if (win.length > 0 && win[0] < i - k + 1) win.shift();
116-
win.push(i);
117-
res.push(nums[win[0]]);
100+
let ans = [];
101+
let q = [];
102+
for (let i = 0; i < nums.length; ++i) {
103+
if (q && i - k + 1 > q[0]) {
104+
q.shift();
105+
}
106+
while (q && nums[q[q.length - 1]] <= nums[i]) {
107+
q.pop();
108+
}
109+
q.push(i);
110+
if (i >= k - 1) {
111+
ans.push(nums[q[0]]);
112+
}
118113
}
119-
return res;
114+
return ans;
120115
};
121116
```
122117

@@ -125,43 +120,40 @@ var maxSlidingWindow = function (nums, k) {
125120
```cpp
126121
class Solution {
127122
public:
128-
vector<int> maxSlidingWindow(vector<int> &nums, int k) {
129-
vector<int> res;
130-
deque<int> q;
131-
for (int i = 0; i < nums.size(); ++i)
132-
{
133-
if (!q.empty() && i - k + 1 > q.front())
134-
q.pop_front();
135-
while (!q.empty() && nums[q.back()] <= nums[i])
136-
q.pop_back();
137-
q.push_back(i);
138-
if (i >= k - 1)
139-
res.push_back(nums[q.front()]);
140-
}
141-
return res;
142-
}
123+
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
124+
deque<int> q;
125+
vector<int> ans;
126+
for (int i = 0; i < nums.size(); ++i)
127+
{
128+
if (!q.empty() && i - k + 1 > q.front()) q.pop_front();
129+
while (!q.empty() && nums[q.back()] <= nums[i]) q.pop_back();
130+
q.push_back(i);
131+
if (i >= k - 1) ans.push_back(nums[q.front()]);
132+
}
133+
return ans;
134+
}
143135
};
144136
```
145137
146138
### **Go**
147139
148140
```go
149141
func maxSlidingWindow(nums []int, k int) []int {
150-
var res []int
151142
var q []int
152-
for i, num := range nums {
143+
var ans []int
144+
for i, v := range nums {
153145
if len(q) > 0 && i-k+1 > q[0] {
154146
q = q[1:]
155147
}
156-
for len(q) > 0 && nums[q[len(q)-1]] <= num {
148+
for len(q) > 0 && nums[q[len(q)-1]] <= v {
157149
q = q[:len(q)-1]
158150
}
159151
q = append(q, i)
160152
if i >= k-1 {
161-
res = append(res, nums[q[0]])
153+
ans = append(ans, nums[q[0]])
162154
}
163155
}
164-
return res
156+
return ans
165157
}
166158
```
167159

Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
class Solution {
22
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-
}
3+
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
4+
deque<int> q;
5+
vector<int> ans;
6+
for (int i = 0; i < nums.size(); ++i)
7+
{
8+
if (!q.empty() && i - k + 1 > q.front()) q.pop_front();
9+
while (!q.empty() && nums[q.back()] <= nums[i]) q.pop_back();
10+
q.push_back(i);
11+
if (i >= k - 1) ans.push_back(nums[q.front()]);
12+
}
13+
return ans;
14+
}
1815
};
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
func maxSlidingWindow(nums []int, k int) []int {
2-
var res []int
32
var q []int
4-
for i, num := range nums {
3+
var ans []int
4+
for i, v := range nums {
55
if len(q) > 0 && i-k+1 > q[0] {
66
q = q[1:]
77
}
8-
for len(q) > 0 && nums[q[len(q)-1]] <= num {
8+
for len(q) > 0 && nums[q[len(q)-1]] <= v {
99
q = q[:len(q)-1]
1010
}
1111
q = append(q, i)
1212
if i >= k-1 {
13-
res = append(res, nums[q[0]])
13+
ans = append(ans, nums[q[0]])
1414
}
1515
}
16-
return res
16+
return ans
1717
}

0 commit comments

Comments
 (0)
Please sign in to comment.