Skip to content

Commit aa827ec

Browse files
authored
feat($239): 增加python3解法
1 parent 844cfa6 commit aa827ec

File tree

1 file changed

+34
-52
lines changed

1 file changed

+34
-52
lines changed

problems/239.sliding-window-maximum.md

+34-52
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,9 @@ Could you solve it in linear time?
3333
符合直觉的想法是直接遍历 nums, 然后然后用一个变量 slideWindow 去承载 k 个元素,
3434
然后对 slideWindow 求最大值,这是可以的,时间复杂度是 O(n \* k).代码如下:
3535

36+
JavaScript:
37+
3638
```js
37-
/**
38-
* @param {number[]} nums
39-
* @param {number} k
40-
* @return {number[]}
41-
*/
4239
var maxSlidingWindow = function(nums, k) {
4340
// bad 时间复杂度O(n * k)
4441
if (nums.length === 0 || k === 0) return [];
@@ -54,6 +51,17 @@ var maxSlidingWindow = function(nums, k) {
5451
return ret;
5552
};
5653
```
54+
Python3:
55+
56+
```python
57+
class Solution:
58+
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
59+
if k == 0: return []
60+
res = []
61+
for r in range(k - 1, len(nums)):
62+
res.append(max(nums[r - k + 1:r + 1]))
63+
return res
64+
```
5765

5866
但是如果真的是这样,这道题也不会是 hard 吧?这道题有一个 follow up,要求你用线性的时间去完成。
5967
我们可以用双端队列来完成,思路是用一个双端队列来保存`接下来的滑动窗口可能成为最大值的数`。具体做法:
@@ -81,54 +89,10 @@ var maxSlidingWindow = function(nums, k) {
8189

8290
## 代码
8391

92+
93+
JavaScript:
94+
8495
```js
85-
/*
86-
* @lc app=leetcode id=239 lang=javascript
87-
*
88-
* [239] Sliding Window Maximum
89-
*
90-
* https://leetcode.com/problems/sliding-window-maximum/description/
91-
*
92-
* algorithms
93-
* Hard (37.22%)
94-
* Total Accepted: 150.8K
95-
* Total Submissions: 399.5K
96-
* Testcase Example: '[1,3,-1,-3,5,3,6,7]\n3'
97-
*
98-
* Given an array nums, there is a sliding window of size k which is moving
99-
* from the very left of the array to the very right. You can only see the k
100-
* numbers in the window. Each time the sliding window moves right by one
101-
* position. Return the max sliding window.
102-
*
103-
* Example:
104-
*
105-
*
106-
* Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
107-
* Output: [3,3,5,5,6,7]
108-
* Explanation:
109-
*
110-
* Window position Max
111-
* --------------- -----
112-
* [1 3 -1] -3 5 3 6 7 3
113-
* ⁠1 [3 -1 -3] 5 3 6 7 3
114-
* ⁠1 3 [-1 -3 5] 3 6 7 5
115-
* ⁠1 3 -1 [-3 5 3] 6 7 5
116-
* ⁠1 3 -1 -3 [5 3 6] 7 6
117-
* ⁠1 3 -1 -3 5 [3 6 7] 7
118-
*
119-
*
120-
* Note:
121-
* You may assume k is always valid, 1 ≤ k ≤ input array's size for non-empty
122-
* array.
123-
*
124-
* Follow up:
125-
* Could you solve it in linear time?
126-
*/
127-
/**
128-
* @param {number[]} nums
129-
* @param {number} k
130-
* @return {number[]}
131-
*/
13296
var maxSlidingWindow = function(nums, k) {
13397
// 双端队列优化时间复杂度, 时间复杂度O(n)
13498
const deque = []; // 存放在接下来的滑动窗口可能成为最大值的数
@@ -153,6 +117,24 @@ var maxSlidingWindow = function(nums, k) {
153117
};
154118
```
155119

120+
Python3:
121+
122+
```python
123+
class Solution:
124+
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
125+
deque, res, n = [], [], len(nums)
126+
for i in range(n):
127+
while deque and deque[0] < i - k + 1:
128+
deque.pop(0)
129+
while deque and nums[i] > nums[deque[-1]]:
130+
deque.pop(-1)
131+
deque.append(i)
132+
if i >= k - 1: res.append(nums[deque[0]])
133+
return res
134+
135+
136+
```
137+
156138
## 扩展
157139

158140
### 为什么用双端队列

0 commit comments

Comments
 (0)