239. 滑动窗口最大值

  1. 题目链接
  2. 解题思路:使用一个队列,队头的就是当前窗口内的最大值。队头到队尾是依次减小的。队中的其他元素是【最大值候选者】。假设当前窗口内值为4, 3, 1, 2,那么队列就是4, 3, 2,为什么?4可能是最大值吗?可能,现在就是最大值。3可能是最大值吗?可能,如果把4淘汰了,就可能是最大值了。1可能是最大值吗?不可能,因为窗口大小为4,1后面有一个2,无论如何,最大值都不可能是1。2可能是最大值吗?可能,因为后面的数据状况未知
    • 我们可以这样思考:从左往右遍历一个数nums[i],它可能是【最大值候选者】吗?肯定可能!即使nums[i]是最小值,如果nums[i]前面的数全部移出窗口后,那么nums[i]就有可能是最大值。
    • 当遍历到nums[i + 1]时,如果发现前面的数,小于nums[i + 1],那么就要把【这些数】从队列中移出去。为什么?因为nums[i + 1]的【生存时间】更长,并且nums[i + 1]数值更大,【这些数】无论如何都不可能是最大值了
  1. 代码
    class Solution:
        def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
            d = deque()
            for i in range(k):
                # 队头就是当前最大的元素
                while d and d[-1] < nums[i]:
                    d.pop()
                d.append(nums[i])
            ans = []
            # 先收集第一个答案
            ans.append(d[0])
            for i in range(k, len(nums)):
                # i - k 不在范围  是否要移出队列
                if nums[i - k] == d[0]:
                    d.popleft()
                while d and d[-1] < nums[i]:
                    d.pop()
                d.append(nums[i])
                ans.append(d[0])
            return ans
    
posted @ 2025-02-15 20:50  ouyangxx  阅读(11)  评论(0)    收藏  举报