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 @   ouyangxx  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示