劍指offer【59-1】:滑動窗口的最大值

題目:

思路+代碼:

思路
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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章