【LeetCode 刷题】栈与队列-队列的应用

此博客为《代码随想录》栈与队列章节的学习笔记,主要内容为队列的应用相关的题目解析。

文章目录

  • [239. 滑动窗口最大值](#239. 滑动窗口最大值)
  • [347. 前 K 个高频元素](#347. 前 K 个高频元素)

239. 滑动窗口最大值

题目链接

python 复制代码
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        q = []
        # 未形成窗口
        for i in range(k):
            while q and q[-1] < nums[i]:
                q.pop()
            q.append(nums[i])
        res = [q[0]]
        # 形成窗口
        for i in range(len(nums) - k):
            # 出窗口
            if q[0] == nums[i]:
                q.pop(0)
            # 入窗口
            while q and q[-1] < nums[i + k]:
                q.pop()
            q.append(nums[i + k])
            res.append(q[0])
        return res
  • 使用非严格递减 单调队列
    • num 入窗口时,需要将队列中所有 < num 的元素弹出(注意不是 <=),再将 num 入队列
    • num 出窗口时,如果和队列头部相等,则队列头部也弹出

(图片源自 Krahets 的题解

347. 前 K 个高频元素

题目链接

python 复制代码
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        count = Counter(nums)
        heap = []
        for key, val in count.items():
            if len(heap) >= k:
                if val > heap[0][0]:
                    heapq.heapreplace(heap, (val, key))
            else:
                heapq.heappush(heap, (val, key))
        return [item[1] for item in heap]
  • 使用优先级队列(最小堆):题目要求的是前 k 个高频元素,通过维护大小为 k 的最小堆,把已经不在前 k 频率的元素(堆顶元素)弹出,最终堆中只剩下前 k 个高频元素,时间复杂度 O ( n log ⁡ k ) O(n\log k) O(nlogk)
  • Python 的 heapq 模块提供了一组操作,用于管理一个最小堆的数据结构:
    • heapq.heappush():将一个元素插入到堆中,同时维护堆的特性
    • heapq.heapreplace():将堆顶元素替换为一个新的元素,同时维护堆的特性
  • 进入堆中的为元组,第一个元素为频率,第二个元素为对应的数字:由于 Python 比较元组时,Python 会从第一个元素开始逐个比较,因此会先比较频率,从而间接将频率作为优先级队列的比较关键字
  • 注:for 循环的变量不能写 k, v,会和函数参数 k 冲突
相关推荐
银河邮差18 分钟前
python实战-用海外代理IP抓LinkedIn热门岗位数据
后端·python
闻缺陷则喜何志丹39 分钟前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
CoovallyAIHub42 分钟前
如何在手机上轻松识别多种鸟类?我们发现了更简单的秘密……
深度学习·算法·计算机视觉
别动哪条鱼43 分钟前
AVAudioFifo
数据结构·ffmpeg·音视频
第二只羽毛1 小时前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫
好难取啊1 小时前
[python学习]案例01:随机验证码与账号密码修改
python
秋邱1 小时前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
艾斯比的日常1 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法
2501_941144421 小时前
Python + C++ 异构微服务设计与优化
c++·python·微服务
CoovallyAIHub1 小时前
抛弃LLM!MIT用纯视觉方法破解ARC难题,性能接近人类水平
深度学习·算法·计算机视觉