剑指 Offer 59 - I. 滑动窗口的最大值

题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。  困难

 

方法:单调递减的双端队列  时间复杂度O(n)  空间复杂度O(n) 

如果每次挪动滑动窗口都遍历去找最值,过于耗时,因此维护一个单调递减的双端队列

移动窗口时,当移除的数等于队首时,需要将队首出队列

      若新入队的数大于队尾,则需将队尾出队,继续判断,直至小于队尾或队空,入队  ( 因为新入队的数相对于原先在队列中的数在滑动窗口中的位置靠后,即比先入队的数晚出窗口,故不用担心 )

算法流程就是形成窗口前加入队列,形成窗口后开始将队首加入res

def maxSlidingWindow(nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if nums == [] or k == 0:
            return []

        deque = []
        for i in range(k):
            while deque and deque[-1] < nums[i]:
                deque.pop()
            deque.append(nums[i])
        
        res = [deque[0]]
        for i in range(k,len(nums)):
            if deque[0] == nums[i - k]:
                deque.pop(0)
            while deque and deque[-1] < nums[i]:
                deque.pop()
            deque.append(nums[i])
            res.append(deque[0])
        
        return res

 

posted @ 2022-08-06 15:26  Liang-ml  阅读(59)  评论(0)    收藏  举报