@@ -33,12 +33,9 @@ Could you solve it in linear time?
33
33
符合直觉的想法是直接遍历 nums, 然后然后用一个变量 slideWindow 去承载 k 个元素,
34
34
然后对 slideWindow 求最大值,这是可以的,时间复杂度是 O(n \* k).代码如下:
35
35
36
+ JavaScript:
37
+
36
38
``` js
37
- /**
38
- * @param {number[]} nums
39
- * @param {number} k
40
- * @return {number[]}
41
- */
42
39
var maxSlidingWindow = function (nums , k ) {
43
40
// bad 时间复杂度O(n * k)
44
41
if (nums .length === 0 || k === 0 ) return [];
@@ -54,6 +51,17 @@ var maxSlidingWindow = function(nums, k) {
54
51
return ret;
55
52
};
56
53
```
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
+ ```
57
65
58
66
但是如果真的是这样,这道题也不会是 hard 吧?这道题有一个 follow up,要求你用线性的时间去完成。
59
67
我们可以用双端队列来完成,思路是用一个双端队列来保存` 接下来的滑动窗口可能成为最大值的数 ` 。具体做法:
@@ -81,54 +89,10 @@ var maxSlidingWindow = function(nums, k) {
81
89
82
90
## 代码
83
91
92
+
93
+ JavaScript:
94
+
84
95
``` 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
- */
132
96
var maxSlidingWindow = function (nums , k ) {
133
97
// 双端队列优化时间复杂度, 时间复杂度O(n)
134
98
const deque = []; // 存放在接下来的滑动窗口可能成为最大值的数
@@ -153,6 +117,24 @@ var maxSlidingWindow = function(nums, k) {
153
117
};
154
118
```
155
119
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
+
156
138
## 扩展
157
139
158
140
### 为什么用双端队列
0 commit comments