@@ -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- */
4239var 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- */
13296var 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