題目描述
給定一個數組 nums,有一個大小爲 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。
返回滑動窗口中的最大值。
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
輸出: [3,3,5,5,6,7]
解釋:
滑動窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
算法思路
最簡單的方法,維持滑動窗口的單調隊列。
每滑動一下,窗口就丟掉一個值,加入一個值,就需要維護隊列。
def add(n):
while True:
if not ls or ls[-1]>=n:
ls.append(n)
break
else:
ls.pop()
def delete(n):
if ls and ls[0]==n:
ls.pop(0)
完整算法
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if not nums:return []
def add(n):
while True:
if not ls or ls[-1]>=n:
ls.append(n)
break
else:
ls.pop()
def dep(n):
if ls and ls[0]==n:
ls.pop(0)
ls=[]
for i in range(k):
add(nums[i])
res=[]
for i in range(k-1,len(nums)):
res.append(ls[0])
dep(nums[i+1-k])
if i+1<len(nums):
add(nums[i+1])
return res
執行用時 :88 ms, 在所有 Python3 提交中擊敗了65.88%的用戶
內存消耗 :17.1 MB, 在所有 Python3 提交中擊敗了100.00%的用戶