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  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示