leetcode239 單調隊列求解滑動窗口最大值**
image
利用單調隊列的方式能把該題的復雜度將為O(N)具體思路為 設置一個雙端隊列來維護窗口內數據最多紀錄窗口大小K個元素 ,由于采用單調隊列所以隊列中的元素是嚴格按照元素大小遞減的方式,為了維護窗口的可是范圍,即窗口以外的元素要及時丟掉 ,隊列中保存的并不是元素本身而是元素在原數組當中的序號或則索引。算法可描述為:
1.先設置一個結果列表(數組) 數組長度為 length(nums)+1-k
2. 遍歷整個數組,當i>=k-1的時候開始記錄將隊列中最左邊元素(最大元素)添加到結果集合中res中
3. 維護雙端隊列做以下兩個判斷:
a. 如果隊列左部的序號超出窗口范圍(n<i-k+1)時候把對頭元素移除掉,保證隊列中 的元素個數不能超過K個
b. 循環處理隊尾元素,當隊尾元素小于當前元素則移除隊尾元素直至隊尾元素大于當前元素,此時當前元素入棧
c. 此時雙端隊列里面維護的從左到右恰恰是第一大、第二大、。。。。。第K大的元素
程序的運行過程可以如下列表格所示:
1552192844(1).png
程序代碼為:
def maxSlidingWindow(self, nums, k):
from collections import deque
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
length = len(nums)
res = []
q= deque()
for idx ,v in enumerate(nums):
#檢查如果左邊界超出窗口就彈出隊列頭
if len(q)>0 and q[0]<=idx -k:
t =q.popleft()
#循環檢查隊尾是否大于當前元素
while len(q)>0 and nums[q[-1]]< v:
q.pop()
q.append(idx)
if (idx>=k-1):
res.append(nums[q[0]])
return res