題目:
思路+代碼:
思路
1. 類似拿到棧中最小值時維持一個非嚴格遞增輔助棧,這裏也是維護一個單調隊列(用的list)
滑塊移動,對滑塊最左邊i,最右邊j判值大小,因爲每次滑塊進來值索引是j+1, 出去值索引i-1;
然後保證當前滑塊的最大值出現在單調隊列的隊首;所以每次進來新的值,都需要從隊尾比較進(維持一個單調隊列),因爲如果只和隊首最大比較,如果隊首元素pop後,後續隊列爲空了;
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
# 思路
# 1. 類似拿到棧中最小值時維持一個非嚴格遞增輔助棧,這裏也是維護一個單調隊列(用的list)
# 滑塊移動,對滑塊最左邊i,最右邊j判值大小,因爲每次滑塊進來值索引是j+1, 出去值索引i-1;
# 然後保證當前滑塊的最大值出現在單調隊列的隊首;所以每次進來新的值,都需要從隊尾比較進(維持一個單調隊列),因爲如果只和隊首最大比較,如果隊首元素pop後,後續隊列爲空了;
if not nums:return []
res, temp_list = [], []
n = len(nums)
for i, j in zip(range(1-k, n-k+1), range(n)): # 找到滑塊最左邊i取值範圍(1-k, n-k+1), 最右邊j取值範圍(0,n-1)
if i > 0 and temp_list[0]==nums[i-1]: temp_list.pop(0) # 當滑塊中最大值是在i-1位置,當移動滑塊後,需要同時pop 隊列中最大值的值
while temp_list and temp_list[-1] < nums[j]: temp_list.pop() # 如果移動滑塊後,nums[j+1]值大於隊尾元素,則元素一直出隊
temp_list.append(nums[j])
if i >= 0: # 只有當滑塊i>=0時,纔開始取滑塊最大值
res.append(temp_list[0])
return res