代码随想录27期|Python|Day13|栈与队列|239. 滑动窗口最大值 (一刷至少需要理解思路)|347.前 K 个高频元素 (一刷至少需要理解思路)

239. 滑动窗口最大值

单调队列

滑动窗口中的队列一直保持出口大,入口小的顺序。(图:代码随想录)

1、每次有新的元素进入(也就是滑动窗口移动后),都需要先和入口的元素比较大小,如果大,就从队尾pop出之前的元素(双向队列的特性),如果小,则保留。

2、每次需要pop队列头部的元素,需要先和当前队列的头部元素比较,只pop滑动窗口即将舍弃的值

from collections import deque

class MyQueue:
    """
    双向队列dequeue
    始终保持队列头部pop()为最大值,尾部push()为最小值
    pop<-- [0] [1] [-1] <--push
            max mid min
    """
    def __init__(self):
        self.queue = deque()
    
    def pop(self, value):
        # 如果队列非空而且需要pop的值恰好就是队头的数值
        if self.queue and value == self.queue[0]:
            self.queue.popleft()

    def push(self, value):
        # 如果队列非空,而且需要push进入的值比队尾的值都大,那么队尾就一直pop出去
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
    
    def getMax(self):
        # 始终保持头部是最大值,返回队列头部就是最大值
        return self.queue[0]

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        queue = MyQueue()
        ans = []
        # 先储存前k个数值,保证队列非空
        for i in range(k):
            queue.push(nums[i])
        ans.append(queue.getMax())
        # 然后遍历nums数组
        for i in range(k, len(nums)):
            queue.pop(nums[i - k])
            queue.push(nums[i])
            ans.append(queue.getMax())
        return ans

347. 前 K 个高频元素​​​​​​​

大顶堆:根节点是最大值,先pop的是最大值

小顶堆:根节点是最小值,先pop的是最小值

所以只需要按照出现频率排序放入小顶堆,然后pop直到还剩k个元素,再按照倒序输出即可。

优先级队列法

1、首先遍历数组建立map键值对;

2、建立小顶堆,按照从大到小的顺序放入键值对,当队列的长度大于k的时候,开始从最小值节点pop元素,留下k个最大值;

3、倒序输出最大值对应的key即可。

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        # 获取键值对
        map_freq = {}  # (key, value) = ('a', 4), ('b', 3) ...
        for item in nums:
            map_freq[item] = map_freq.get(item, 0) + 1  # 注意get写法
        
        # 构造小顶堆
        prime_que = []  # 创建优先级队列(这里是小顶堆)
        """
        heapq用法:
        heapq.heappush()是往堆中添加新值
        heapq.heappop()是从堆的根节点弹出值,大顶堆弹出最大值,小顶堆弹出最小值
        """
        for key, value in map_freq.items():
            heapq.heappush(prime_que, (value, key))  # 先入的是最大值
            if len(prime_que) > k:
                heapq.heappop(prime_que)
        res = [0] * k
        
        # 倒序输出
        for i in range(k-1, -1, -1):
            res[i] = heapq.heappop(prime_que)[1]
        return res

注意构造小顶堆的方式:heapq

heapq用法:

heapq.heappush()是往堆中添加新值

heapq.heappop()是从堆的根节点弹出值,大顶堆弹出最大值,小顶堆弹出最小值

 第13天完结🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cadence中如何在更新原理图封装

cadence中如何在更新原理图封装 一、更改原理图封装 当原理图画好后&#xff0c;如果我们发现某个封装错了&#xff0c;需要改动&#xff0c;需要找到你最初画Library中器件封装文件打开&#xff0c;进行修改&#xff0c;修改好后保存。 二、更新封装 保存好后&#xff0c;…

基于Java SSM框架实现高校人事管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高校人事管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用户的需…

各个数据库存二进制大文件性能测试

1前言 ​ 有个项目软件前端将二进制大文件存在了indexDB,每次给后端传文件&#xff08;需要传到底层C进行调用&#xff09;都会导致内存占用飙升&#xff0c;想着使用前后端都能共同操作的数据库来解决这个内存占用的问题&#xff0c;并且希望这个更具尽可能的轻量&#xff0c…

【文末送书】拥抱智能驾驶

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

总结6种@Transactional注解的失效场景

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 引言 昨天有粉丝咨询了…

海豚²来了丨DolphinDB 集成 DolphinScheduler,任务调度更轻松

DolphinDB 是一款高性能时序数据库。DolphinDB 集成了功能强大的编程语言和高容量高速度的批流一体数据分析系统&#xff0c;为海量数据&#xff08;特别是时间序列数据&#xff09;的快速存储、检索、计算及分析提供一站式解决方案。在实际生产环境中&#xff0c;经常存在数据…

以太坊:前世今生与未来

一、引言 以太坊&#xff0c;这个在区块链领域大放异彩的名字&#xff0c;似乎已经成为了去中心化应用&#xff08;DApps&#xff09;的代名词。从初期的萌芽到如今的繁荣发展&#xff0c;以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生&#xff0c;以…

cordic 算法学习记录

参考&#xff1a;b站教学视频FPGA&#xff1a;Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单&#xff0c;但是实现乘除以及函数计算复杂度高且占用资源多&#xff0c;常见的计算三角函数/平方根的求解方式有①查找表&#xff1a;先把函数对应…

解决夜神模拟器与Android studio自动断开的问题

原因&#xff1a;夜神模拟器的adb版本和Android sdk的adb版本不一致 解决办法&#xff1a; 1.找到android的sdk &#xff08;1&#xff09;File--->Project Structure (2)SDK Location:记下sdk的位置 2.找到sdk中的adb文件 SDK-->platform-tools-->adb.exe 3.复制…

轻松管理远程设备,Termius for Mac助你畅享多协议远程管理

在当今数字化时代&#xff0c;远程管理已经成为许多人日常工作中不可或缺的一部分。无论你是IT专业人士、开发者还是网络管理员&#xff0c;都需要一个强大而可靠的远程管理工具。而Termius for Mac&#xff08;多协议远程管理软件&#xff09;正是你的最佳选择。 Termius for…

三翼鸟2023辉煌收官, 定盘2024高质量棋局

最近在不同平台上接连看到这样的热搜话题&#xff1a;用时间胶囊记录2023的自己、2023年度问答、2023十大网络流行语公布… 显然&#xff0c; 2023年进入最后一个月&#xff0c;时间匆匆&#xff0c;这也意味着又到了总结过去和规划未来的时候。拿到结果、取得成绩当然是对202…

语音验证码的使用场景

相较于短信验证&#xff0c;语音验证是一种特殊的验证方式&#xff0c;目前在“用户注册”场景下更多的是作为短信验证码的一种补充&#xff0c;当收不到短信时&#xff0c;用户可以选择接听电话的方式来获取验证码&#xff0c;最大程度上避免用户流失。 在一些需要验证用户身…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境微信开发者工具OneNET云平台 模块实现1. 数据预处理2. 创建模型并编译3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 上传结果1&#xff09;…

农副产品行业ERP有哪些?农副产品行业ERP是做什么的

现实生活当中有很多种类的农副产品&#xff0c;这些琳琅满目的商品有多元化的营销渠道和策略&#xff0c;同时在保质期、包装、价格策略、配料、生产工艺等诸多方面存在明显的差异。 由于行业的特殊性&#xff0c;传统的人工统计分析工作量较大&#xff0c;同时也难以确保业务…

数字图像处理(实践篇)二十二 使用opencv进行人脸、眼睛、嘴的检测

目录 1 xml文件 2 涉及的函数 3 实践 使用opencv进行人脸、眼睛、嘴的检测。 1 xml文件 方法① 下载 地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_default.xml文件 对着Raw右键&#xff0c;选择“链接…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

路面状况监测站-科普百科

随着城市化进程的加速&#xff0c;道路交通问题日益凸显&#xff0c;路面状况的监测和预警成为了至关重要的一环。为了保障市民的出行安全&#xff0c;路面状况监测站智能设备&#xff0c;为您的出行保驾护航。 WX-LM1路面状况监测站采用了物联网技术&#xff0c;通过传感器实…

节省时间,提高效率:深入解析MyBatis Plus

1. MyBatis Plus 概述 将Mybatis 通用Mapper PageHelper 升级成 MyBatis Plus 1.1 简介 官网&#xff1a;https://baomidou.com/ 参考教程&#xff1a;https://baomidou.com/pages/24112f/ MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#…

【Axure原型分享】3D多柱状图_中继器版

今天和大家分享3D多柱状图_中继器版的原型模板&#xff0c;鼠标移入时&#xff0c;对应区域的背景会高亮变色&#xff0c;并且显示对应柱状体的数据。那这个原型是用Axure原生元件制作的&#xff0c;样式交互都可以自行修改&#xff0c;图表数据在中继器表格里填写&#xff0c;…

企业举办年会,可以邀请哪些媒体进行宣传?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 年关将至&#xff0c;筹办年会成为每个企业必做的事情&#xff0c;也是大家非常期待的年终大会&#xff0c;在我们策划年会时候&#xff0c;也要抓住最后宣传的机会。那么企业举办年会时…