【LeetCode】239. 滑动窗口最大值

这题其实挺不好写的。知识点虽然重要,但细节非常繁琐,我这一次(20240709)花费了大概2个小时才写出这道题,但其实这还是我已经知道这道题是需要使用"单调队列"算法来求解,并我已事先学过单调队列算法了。所以知易行难,提升算法水平,还是需要老老实实的多敲代码。

1. 题目

题目的意思很好理解,就是求某个数组固定大小窗口内的最大值。

2. 分析

我写这部分代码的时候,犯了三个错误:

  • 应该先把当前的数同队列尾部的数比较,然后处理;
  • 当前的每个数都会被入队,但是后面入队的数可能会因为"质量"更高而把当前数从队尾移除
  • 不会熟练使用Python自身的队列结构,从而被迫使用数组模拟队列,导致代码变得复杂

3. 代码

python 复制代码
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        que = [0 for i in range(len(nums))]
        front = rear = 0
        res = []
        if k == 1:
            return nums
        for i in range(1, len(nums)):
            #关键点1:先把队尾处理了,再处理队首。原因很简单:队尾可能就是当前元素
            tail = que[rear]
            while(nums[i] >= nums[tail] and (i-tail) < k and rear >= 0):
                rear -= 1
                if rear>=0:
                    tail = que[rear]
			# 关键点2:无论当前来的是什么数,都会给它放到队列中
            rear+=1
            que[rear] = i
			
            head = que[front]
            while(i >= head + k and front <= rear):
                front += 1
                head = que[front]
            if (i >= k-1): # 可以构成一个窗口
                head = que[front]
                res.append(nums[head])
        return res
相关推荐
圣保罗的大教堂5 小时前
leetcode 3867. 数对的最大公约数之和 中等
leetcode
To_OC7 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
renhongxia19 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
G.O.G.O.G10 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
zephyr0511 小时前
动态规划-最长上升子序列问题
算法·动态规划
闪电悠米12 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法
卡提西亚13 小时前
leetcode-1438. 绝对差不超过限制的最长连续子数组
算法·leetcode·职场和发展
Java面试题总结13 小时前
LeetCode 93.复原IP地址
算法·leetcode·职场和发展·.net
从零开始的代码生活_14 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
Tisfy14 小时前
LeetCode 3867.数对的最大公约数之和:按题目说的做(gcd)
算法·leetcode·题解·模拟·最大公约数·gcd