代码随想录算法训练营第13天|● 239. 滑动窗口最大值 ● 347.前 K 个高频元素

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充 本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。 阅读详情


前言

今天是队列专项:都需要思考,不是很难,重新做

链接

原来csdn的粉丝都是机器人,我说怎么那么多人,好吧,我随便记录一下,既然没有人看

239. 滑动窗口最大值

在这里插入图片描述
💖非常典型的队列题目

思路

暴力求解: 遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法
总体思路: 此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。
在这里插入图片描述
保证队列里的元素单调递减: 队列里面放入一个元素就和前面一个元素比较,如果比它大就pop前面的,如果比它小再放进去; [有动图]

设计单调队列的时候,pop,和push操作要保持如下规则:

  • pop(value):如果窗口向后移动要移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
  • push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出【大于入口说明大于所有的,前面所有的都弹出】,直到push元素的数值小于等于队列入口元素的数值为止
  • 在这里插入图片描述

自己写 注意事项【最好重新做一遍】

  1. python的deque的index也是从0开始从最左边开始标;
  2. 怎么方便怎么来:pop和popleft都用到了
  3. 所有的pop操作都需要判断是否为空【我在写myqueue的pop就忘了】
  4. push的def再看一下写法
from collections import deque
class MyQueue: #单调队列(从大到小
    def __init__(self):
        self.queue = deque() #这里需要使用deque实现单调队列,直接使用list会超时
    
    #每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
    #同时pop之前判断队列当前是否为空。
    def pop(self, value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()#list.pop()时间复杂度为O(n),这里需要使用collections.deque()
            
    #如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
    #这样就保持了队列里的数值是单调从大到小的了。
    def push(self, value):
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
        
    #查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
    def front(self):
        return self.queue[0]
class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """

        que = MyQueue()
        result = []
        for i in range(k): #先将前k的元素放进队列
            que.push(nums[i])
        result.append(que.front()) #result 记录前k的元素的最大值
        for i in range(k, len(nums)):
            que.pop(nums[i - k]) #滑动窗口移除最前面元素
            que.push(nums[i]) #滑动窗口前加入最后面的元素
            result.append(que.front()) #记录对应的最大值
        return result

347.前 K 个高频元素

在这里插入图片描述

思路

知识补充:大顶堆和小顶堆注意这个里面使用大小顶堆进行排序

  • 本题中使用小顶堆:因为小顶堆最上面的是最小的,会弹出去,把小的都弹出去之后留下大的;
  • python使用heapq来做顶堆:heapqpush(ans, ele_v)的时候放入堆,它会自动排序;headpop弹出最顶部的那个;

这道题目主要涉及到如下三块内容:

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素

💘统计频率:使用map来做呀,这时候要记住了
排序:通常是使用快排,返回前k个,但是由于这里只需要k,所以只用对k个元素进行维护;
具体做法:遍历的时候使用小顶堆,当小顶堆长度大于k的时候,就pop出去根节点最小的,这样保证留下来的都是k大的;
但是由于小顶堆pop出去的都是从小到大,题目要求从大到小;方法:在装入result数组 的时候,从后往前装–1
在这里插入图片描述

方法一 使用顶堆

注意事项

  1. 在 搭建小顶堆的时候,push进去的是键值对,但是value要写在前面,因为根据value来进行堆的构建:heapq.heappush(pri_que, (freq, key))
    相应的,pop之后也是一对以(freq, key)排序的,加入result的时候append ele[1]:heapq.heappop(pri_que)[1]
  2. 要记住了:map_[nums[i]] = map_.get(nums[i], 0) + 1这一行代码来统计频率
  3. 创建小顶堆也是用的数组;pri_que
  4. 倒序修改list需要先创建一个那么大的list[0]*K
    在这里插入图片描述
    在这里插入图片描述
import heapq
class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        map_ = {}
        for i in range(len(nums)):
            map_[nums[i]] = map_.get(nums[i],0)+1
        pri_que = []
        for key, value in map_.items():
            heapq.heappush(pri_que,(value,key))
            if len(pri_que)>k:
                heapq.heappop(pri_que)
        result = [0]*k
        for i in range(k-1,-1,-1):
            result[i] = heapq.heappop(pri_que)[1]
        return result

方法二 使用字典

普通排序的方法

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        # 使用字典统计数字出现次数
        time_dict = defaultdict(int)
        for num in nums:
            time_dict[num] += 1
        # 更改字典,key为出现次数,value为相应的数字的集合
        index_dict = defaultdict(list)
        for key in time_dict:
            index_dict[time_dict[key]].append(key)
        # 排序
        key = list(index_dict.keys())
        key.sort()
        result = []
        cnt = 0
        # 获取前k项
        while key and cnt != k:
            result += index_dict[key[-1]]
            cnt += len(index_dict[key[-1]])
            key.pop()

        return result[0: k]

总结-栈与队列的总结

在这里插入图片描述
知识点的补充
在这里插入图片描述

某手 v8.x 签名计算方法(二) sig和__NS_sig3 一、目标 今天的目标是 sig和__NS_sig3,咱们抓个包先 二、步骤 sig目测像是MD5 先jadx搜索 sig= ,没有找到结果。 再试试 sig ,晕倒 6k多个结果,突然灵光一闪,这些参数,必然是要加入到 Map中,那么我们搜索 "sig" 应该就是这个 CPU.getClock,Hook之 var signCls = Java.use('com.yxcorp.xxx.util.CPU'); signCls.getClock.implementation = function(a,b,c 阅读详情

相关推荐

XVF3800麦克风阵列实战:从选型到快速原型搭建

本文详细介绍了XVF3800麦克风阵列的选型与快速原型搭建实战经验。从开箱即用的特性到波束成形、回声消除等核心功能拆解,再到硬件设计避坑指南和固件开发技巧,帮助开发者高效实现智能语音设备的开发。特别适合智能音箱、会议终端等需要远场拾音和声源定位的应用场景。

weixin_29161719的博客 274

代码随想录算法训练营第13天 | ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结

如果新压入元素比队尾入口元素还要大,那么则新元素“又大又新”,队尾入口元素“永无出头之日”,不可能成为滑动窗口最大值,因此可以直接把队尾元素移除。为了降低新增删除的时间复杂度,只把有可能成为“窗口中最大值”的元素存储在单调队列中,而不是全部k个。有可能成为“窗口中最大值”的元素,满足两个条件:“足够大”是窗口中最大的,“足够新”,必须在滑动窗口中。上述定义的单调队列,可以称之为,找系列元素最值的专用数据结构,在这个系列元素本身新增删除的时候,仍然可以以O(1)的时间找到最值。每次新进窗口的元素,也即需要。

henry87653的博客 283

静态时序分析(Static Timing Analysis, STA):简介及内容导航

静态时序分析(简称STA)是用来验证数字设计时序的技术之一,另外一种验证时序的方法是时序仿真,时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一,简单来说,时序分析的目的就是为了解决设计中的各种时序问题。STA被称为静态的原因是其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励。相比之下,时序仿真则可以被视作动态地执行对设计的分析,具体过程描述如下:施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激。

Starry__的博客 1993

代码随想录算法训练营第13天|● 239. 滑动窗口最大值● 347.前 K 个高频元素

解一(暴力解):假设窗口为k,数组大小为n,每次在一个窗口找最大值,遍历n-k次,则时间复杂度O(kn)优解:时间消耗大的还是在找最大值方面,定义一个单调(从大到小单调减)队列,队列里面仅维护当前窗口可能的最大值。时间复杂度O(n)单调队列遵循规则:pop():队列非空,且并且当前value值等于单调队列的队头元素,则弹出队头元素push(value):value值必须大于队尾元素,才把value加入单调队列,若不是,则一直弹出队尾元素直到队列为空或满足value大于队尾元素.再加入队列。

weixin_54583561的博客 1305

Vscode远程免密连接Linux虚拟机,并配置C/C++运行环境

目前想要深入学习在Linux,也为了方便编写C/C++程序。Linux的环境里一般自带有c++的编译环境,如果没有安装gcc和g++等编译器也比较便利。但是在虚拟机里用vim编写C++程序又不得劲,因此打算使用vscode远程连接Linux虚拟机进行学习。为了防止自己以后还要再配置,重复踩坑,因此写下这篇博客用做记录。环境:windows11、VMware17、rocky linux9.1 ( 开源的CentOS9 )

m0_56779872的博客 8678

Python-OPCUA 实现西门子PLC数据批量读写与自动化监控

本文详细介绍了如何使用Python结合OPC UA协议,实现对西门子PLC数据的批量读写与自动化监控。通过搭建开发环境、利用KEPserverEX作为通信桥梁,并配合Python代码实战,读者可以掌握高效的数据采集、批量写入以及构建带报警功能的监控系统的方法,从而大幅提升工业自动化场景下的数据处理效率和系统灵活性。

www00的博客 181

代码随想录算法训练营第13天|● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结

困难给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值示例 2:输入:nums = [1], k = 1输出:[1]

嗝~~~~的博客 244

48、住宅抵押贷款支持证券的定价、风险评估与结构化设计

本文深入探讨了住宅抵押贷款支持证券(RMBS)的定价、风险评估与结构化设计。内容涵盖提高定价准确性的方差缩减方法,如准蒙特卡罗序列的应用;分析RMBS面临的利率风险、信用风险和模型风险,并提出相应的度量与应对策略;介绍利用动态规划优化CMO分层结构以最大化发行利润的方法。同时总结了RMBS的基本类型、定价流程及市场发展趋势,为投资者和发行人提供全面的决策支持。

quiet的专栏 154

代码随想录算法训练营第13天||● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

大概思路就是,我们创建一个大小为k的小根堆优先队列,然后往优先队列中加入元素的频率,当加入的元素大于k时,优先队列弹出值,此时弹出的值是从最小值开始弹出。如果需要入队的元素大于队列中的尾部元素,我们就需要将尾部元素弹出,直到要入队的元素小于或等于尾部元素,此时将该元素插入插入队尾。我们可以构建一个单调队列,去维护每次滑动窗口中的最大值,也就是将每次滑动窗口中的最大值放在队列的头部,这样的话我们得到每次滑动窗口的最大值就只需要在每次滑动窗口的时候,将队列中的头部插入结果数组即可。解法二:队列中存入数组下标。

m0_56068266的博客 172

【大模型】Coze AI 智能体工作流从配置到使用实战详解

Coze 扣子智能体工作流从配置到使用实战详解

congge 1万+

2023年高教社杯全国大学生数学建模竞赛 E 题:《黄河水沙监测数据分析》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 904

代码随想录算法训练营第13天|150. 逆波兰表达式求值● 239. 滑动窗口最大值● 347.前 K 个高频元素

思路:先统计元素出现的频率,考虑使用map集合。为了找到前k个高频的元素,需要对这k个高频的元素进行排序,直接将所有元素进行排序效率比较低,因此采用小顶堆的方式只维护k个元素,有频率比较高的元素入堆,便将最小频率的元素移除小顶堆。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。采用这个来构成小顶堆。map.put("C语言入门教程", "http://c.biancheng.net/c/");一、150. 逆波兰表达式求值。

weixin_44565532的博客 2377

Win11 系统下 VisualStudio2022 配置点云库 PCL1.11.1

安装完成之后打开文件夹E:\PCL 1.11.1\3rdParty\OpenNI2双击 并选择路径 (E:\PCL 1.11.1\3rdParty\OpenNI2) 安装即可全部安装完成之后,将pcl-1.11.1-pdb-msvc2019-win64.zip解压后的 .pdb文件拷贝到(E:\PCL 1.11.1\bin)中设置环境变量:到此,环境变量配置完成。

qq_53545309的博客 1127

代码随想录算法训练营第13天| 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

算法真是需要脑子的

m0_50846237的博客 198

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

代码随想录算法训练营第13天| ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素

栈和队列总结。

mw_studio的博客 257

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

代码随想录算法训练营第13天 |● 239. 滑动窗口最大值 ● 347.前 K 个高频元素

【代码】代码随想录算法训练营第13天 |● 239. 滑动窗口最大值 ● 347.前 K 个高频元素。

weixin_39248851的博客 236

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

代码随想录算法训练营第13天 | ● 239. 滑动窗口最大值● 347.前 K 个高频元素 ||第12天休息

一、239. 滑动窗口最大值本题重在分析:1.解题步骤,分为poll,add和得最大值三步;2.使用的数据结构,有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了,但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。因此,我们需要自己的队列。

m0_51671538的博客 177

代码随想录算法训练营第13天 | 栈与队列part03:● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

但这是补的博客,没有仔细分析。复习的时候再仔细总结。这是补的博客,没有仔细分析。复习的时候再仔细总结。好难的,是我做的第一个hard吧。

weixin_51674457的博客 686

代码随想录算法训练营day13● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

然后加入-3,前面的元素都比-3大,此时的最大值还是出口处的元素3。接下来,滑动窗口向后移动,pop3,加入5,前面的元素都比5小,将前面的元素都弹走,此时最大元素为出口处的5。接下来加入3,最大值为5,加入2,最大值为5。再向后移动,pop5,push1,最大值为3。最大值:{3,3,5,5,5,3}

m0_74845823的博客 1484

代码随想录算法训练营第13天(栈和队列3+总结篇 239. 滑动窗口最大值 | 347.前 K 个高频元素

栈与队列总结篇栈实现队列用队列实现栈括号匹配问题字符串去重问题逆波兰表达式问题滑动窗口最大值前K个高频元素(介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。

weixin_46743838的博客 1683

代码随想录算法训练营 day13 || 239. 滑动窗口最大值,347. 前K个高频元素

解题状态:第一题在有了单调队列的思路后自行实现;第二题未能解出。239. 滑动窗口最大值思路:本题官方题解以及代码随想录所给出的代码中都用到了Deque这种双向队列,双向队列是一种首尾皆可出队与入队的特殊队列。这种工具非常值得学习,特别是我这个不会的人。回到这道题,由于我对双向队列的陌生,我认为与大多数栈与队列题目类似,栈与队列仅仅是一种数据存储的工具,因此可以采用任何容器结合静态指针实现栈与队列的模拟,甚至在一定程度上,会比声明Stack与Queue结构来的更加具有时间效率。

旭 1056

代码随想录算法训练营第13天| Leetcode 239. 滑动窗口最大值、347.前 K 个高频元素

今天的题目思维难度有点大,虽然只有两道题,但是还是花了很多时间。最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

Camellia__Wang的博客 1242

代码随想录算法训练营第13天|239.滑动窗口最大值、347.前k个高频元素

map统计每个元素出现的频率,key元素,value元素出现频率,用优先级队列遍历map,对key,value键值对进行排序,排序的方式是小顶堆,维持队列大小为K,当超过K时,就把队头的元素弹出,由于以小顶堆方式排序,所以频率小的被弹出了,队列中剩的就是频率前k个的元素,由于小顶堆,所以输出到数组时,要想是频率从高到低,得逆序。如果容器不为空,则让当前元素和容器的最后一个元素比较,如果大于,则将容器的最后一个元素删除,然后继续将当前元素和容器的最后一个元素比较。如果容器为空,则直接将当前元素加入到容器中。

weixin_51871394的博客 1019

代码随想录算法训练营第13天 | 239. 滑动窗口最大值 347.前 K 个高频元素 总结

pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。lambda 表达式设置优先级队列从大到小存储 o1 - o2 为从小到大,o2 - o1 反之。

Laulian的博客 970

代码随想录算法训练营Day11 | 150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素

训练营第11天:150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素

jiabao0520的博客 1347

代码随想录算法训练营day13 | 239. 滑动窗口最大值、347.前 K 个高频元素

LeetCode | 239. 滑动窗口最大值、347.前 K 个高频元素

weixin_69675605的博客 1143
上一篇: 李栋新文章-挂上了biorxiv,做光片的SR记录一下【很好的学习文章】
下一篇: 代码随想录算法训练营第14天 |● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代
Xalileetcode
博客等级 码龄7年 482粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值