49
49
50
50
<!-- 这里可写通用的实现逻辑 -->
51
51
52
- 单调队列。
52
+ ** 方法一: 单调队列**
53
53
54
54
单调队列常见模型:找出滑动窗口中的最大值/最小值。模板:
55
55
@@ -73,16 +73,17 @@ for i in range(n):
73
73
``` python
74
74
class Solution :
75
75
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):
78
79
if q and i - k + 1 > q[0 ]:
79
80
q.popleft()
80
- while q and nums[q[- 1 ]] <= num :
81
+ while q and nums[q[- 1 ]] <= v :
81
82
q.pop()
82
83
q.append(i)
83
84
if i >= k - 1 :
84
- res .append(nums[q[0 ]])
85
- return res
85
+ ans .append(nums[q[0 ]])
86
+ return ans
86
87
```
87
88
88
89
### ** Java**
@@ -93,24 +94,21 @@ class Solution:
93
94
class Solution {
94
95
public int [] maxSlidingWindow (int [] nums , int k ) {
95
96
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<> ();
101
99
for (int i = 0 , j = 0 ; i < n; ++ i) {
102
100
if (! q. isEmpty() && i - k + 1 > q. peekFirst()) {
103
101
q. pollFirst();
104
102
}
105
103
while (! q. isEmpty() && nums[q. peekLast()] <= nums[i]) {
106
104
q. pollLast();
107
105
}
108
- q. offerLast (i);
106
+ q. offer (i);
109
107
if (i >= k - 1 ) {
110
- res [j++ ] = nums[q. peekFirst()];
108
+ ans [j++ ] = nums[q. peekFirst()];
111
109
}
112
110
}
113
- return res ;
111
+ return ans ;
114
112
}
115
113
}
116
114
```
@@ -124,24 +122,21 @@ class Solution {
124
122
* @return {number[]}
125
123
*/
126
124
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
+ }
143
138
}
144
- return res ;
139
+ return ans ;
145
140
};
146
141
```
147
142
@@ -150,43 +145,40 @@ var maxSlidingWindow = function (nums, k) {
150
145
``` cpp
151
146
class Solution {
152
147
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
+ }
168
160
};
169
161
```
170
162
171
163
### **Go**
172
164
173
165
```go
174
166
func maxSlidingWindow(nums []int, k int) []int {
175
- var res []int
176
167
var q []int
177
- for i, num := range nums {
168
+ var ans []int
169
+ for i, v := range nums {
178
170
if len(q) > 0 && i-k+1 > q[0] {
179
171
q = q[1:]
180
172
}
181
- for len(q) > 0 && nums[q[len(q)-1]] <= num {
173
+ for len(q) > 0 && nums[q[len(q)-1]] <= v {
182
174
q = q[:len(q)-1]
183
175
}
184
176
q = append(q, i)
185
177
if i >= k-1 {
186
- res = append(res , nums[q[0]])
178
+ ans = append(ans , nums[q[0]])
187
179
}
188
180
}
189
- return res
181
+ return ans
190
182
}
191
183
```
192
184
0 commit comments