day11 栈与队列

news/2024/10/18 15:08:43/文章来源:https://www.cnblogs.com/haohaoscnblogs/p/18326972

任务

150. 逆波兰表达式求值

思路

用栈保存操作数,遇到操作符,将操作数弹出并处理。注意除法的逻辑

class Solution:def evalRPN(self, tokens: List[str]) -> int:s = []from operator import add, sub, mulop_dic = {'+':add,'-':sub }for i in range(len(tokens)):if tokens[i] not in {'+','-','*','/'}:s.append(int(tokens[i]))elif tokens[i] == '+':op2 = s.pop()op1 = s.pop()s.append(add(op1,op2))elif tokens[i] == '-':op2 = s.pop()op1 = s.pop()s.append(sub(op1,op2))elif tokens[i] == '*':op2 = s.pop()op1 = s.pop()s.append(mul(op1,op2))elif tokens[i] == '/':op2 = s.pop()op1 = s.pop()val =  op1//op2 if op1 * op2 > 0 else -(abs(op1) // abs(op2))# 向0取整s.append(val)return s[0]

239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值

思路

额外维护这样一个滑动窗口(双端队列结构),因此该结构需要保证:某一时刻,双端队列中头结点的值为最大值。
逻辑上,双端队列维护的是什么信息呢?

  1. 如果依次扩充窗口,谁会成为最大值的信息。
  2. 如果不再扩充而是依次缩减滑动窗口,谁会成为最大值的信息。

当数组中的窗口往右扩时,为了维护上述结构,需要队列中将它之前比它小的数都移除出去。这个是比较好想到的。
更深入的思考:为什么新的数进来后可以让之前比它小的数(或者相等的数)弹出呢?因为这个弹出的数再也不可能成为最大值了,我的新数比你大还比你晚过期,那么就不需要你这个旧的小值了。也即是,滑动窗口实际上维护的信息是两个维度,数字越新越大越优先。按照上述逻辑,实际上,双端队列每一时刻都是单调递减的。那么缩减呢?只有当前要缩减的元素没有在之前扩充时处理过,才缩减,否则已经被处理过了。
完整的算法如下

  • 扩充:只要比当前要入队的数小,则从窗口中弹出
  • 缩减:如果和头节点的数一样(旧的最大值),则弹出。否则当前需要处理的数就是又旧又不是之前的最大值的数,扩充时已经被处理过了。
  • 最大值:队首元素
class MyWindow:def __init__(self):self.queue = deque()def push(self,val):while(self.queue and val > self.queue[-1]): #只要比当前要入队的数小,则从窗口中弹出self.queue.pop()self.queue.append(val) #将当前值放入滑动窗口def pop(self,val):if(self.queue and self.queue[0] == val):self.queue.popleft()def getMaxValue(self)->int: return self.queue[0]class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:res = []window = MyWindow()for i in range(k):window.push(nums[i]) res.append(window.getMaxValue()) size = len(nums)for i in range(k,size):window.pop(nums[i-k])window.push(nums[i])maxV = window.getMaxValue()res.append(maxV)return res

347.前 K 个高频元素

思路

堆(优先级队列)
这里只考虑优先级队列的功能,暂时不考虑实现(上滤下滤等),以小顶堆为例,即在加入和删除元素的过程中,堆顶元素保持最小值。
我们用dic来统计频率,然后利用小顶堆依次添加,达到k个后,再依次添加和弹出最小元素,保证最大的k个元素均在小顶堆中,即可完成。

class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:import heapqimport collectionsdic = collections.defaultdict(int) for i in range(len(nums)):dic[nums[i]] += 1pq = [] #默认小顶堆for key,v in dic.items():heapq.heappush(pq,(v,key))if len(pq) > k:       #后续每次新加入元素,满足堆的结构后,弹出堆顶元素(最小值)heapq.heappop(pq)#此时pq中的元素为最大的k个元素,pq的堆顶为这k个内最小的元素res = [0]*kfor i in range(k-1,-1,-1): #逆序赋值,保证次数单调递减,val的次数越多的越靠前val = heapq.heappop(pq)[1]res[i] = valreturn res

心得体会

复习了栈的应用,学习了滑动窗口(双端队列)和优先级队列。注意后两种结构的思路和应用。

  • 栈的应用 相邻项之间的消除
  • 滑动窗口 与之前的数组中那道题不同,本题是自定义了一种特殊功能的数据结构,保证了可以很快取出极值,并随着窗口的滑动,这个性质保持不变。
  • 优先级队列 同样利用元素的插入删除,堆结构性质的一致性,保证栈顶为极值,解决topK问题。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透

渗透测试 一、简介 ​ 渗透测试(Penetration Testing)是一种通过模拟攻击的技术与方法,挫败目标系统的安全控制措施并获得控制访问权的安全测试方法。 ​ 网络渗透测试主要依据CVE(Common Vulnerabilities and Exposures,通用漏洞与披露)已经发现的安全漏洞,模拟入侵者的攻击…

学习Java的第四周

第四周的学习记录来喽,本周的重点就是之前提到过的判断和循环(其中包括流程控制语句的三种结构:顺序、分支、循环;顺序结构即Java程序的默认流程,分支结构学了if判断语句的三种格式、switch语句练习和扩展知识,循环结构学了for循环格式和练习、累加思想和统计思想、while…

idea在pom中引入第三方依赖

项目右侧点击maven,点击加号(鼠标放上去会出现add maven project字样) 找到要导入的项目的pom文件选中,ok(这里我以及导入过了,所以ok是灰色) 回到原项目中,在pom中添加dependency 其中,artifactId是导入进来的姓名的名字,groupId是导入进来的项目的java目录下的包名…

计算机组成与体系结构-cache

概念 Cache,高速缓冲存储器。是解决CPU与主存之间速度不匹配而采用的一项重要技术,位于主存与CPU之间,由静态存储芯片(SRAM)组成,容量比较小,Cache存储了频繁访问的内存数据命中率 CPU欲访问的信息已在Cache中的比率,设在一段程序执行期间cache完成存取次数为NC,主存完成…

《Programming from the Ground Up》阅读笔记:p88-p94

《Programming from the Ground Up》学习第5天,p88-p94总结,总计7页。 一、技术总结 1.touppercase.s #PURPOSE: This program converts an input file #to an output file with all letters #converted to uppercase.#PROCESSING: #(1)Open the input file #(2)Open the o…

计算机网络第三讲 数据链路层

计算机网络第三讲 数据链路层 第一节:数据链路层功能 1. 概述2. 数据链路层的功能封装成帧透明传输差错控制实现无比特差错 不是可靠传输 丢失,乱序,重复无法解决

计算机组成与体系结构-层次化存储体系

将数据分为多个层次进行存储,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统. 解决两个矛盾采用层次化存储体系,可以通过平衡存储介质的速度和成本得到最佳的存储效用。解决了主存容量不足与高成本的矛盾、CPU与主存速度不匹配的矛盾存储器分类RAM,随机存…

计算机网络第一讲

计算机网络第一讲 计算机网络概述考点一 1. 计算机网络的定义2. 计算机网络的组成物理组成工作方式英特网中的服务 考研中只有 TCP是可靠服务,其他都是不可靠的 面向连接的服务只有1.TCP 2.PPP 其他所有均无连接有应答服务:1.TCP 2.CSMA/CA3. 计算机网络的特点 共享4. 计算机…

计算机组成原理基础第7讲 输入输出系统

计算机组成原理基础第7讲 输入输出系统2. 输入输出系统的组成考点二:I/O接口接口的功能和组成I/O接口的基本组成3. 接口类型4. 程序查询方式考点三:中断系统

ABC273F Hammer 题解

dp的本质是拓扑(),感觉可以套一个线段树优化建图搞到 nlogn,好喔ABC273F Hammer 题解 题目大意 数轴上有 \(n\) 个锤子和 \(n\) 堵墙,第 \(i\) 个锤子位于 \(x_i\),第 \(i\) 堵墙位于 \(y_i\),第 \(i\) 个锤子可以对应的敲开第 \(i\) 堵墙。以原点为起点,给定终点 \(t\…

一款.NET开源、跨平台的DASH/HLS/MSS下载工具

前言 今天大姚给大家分享一款.NET开源(MIT License)、免费、跨平台的DASH/HLS/MSS下载工具,并且支持点播和直播(DASH/HLS)的内容下载:N_m3u8DL-RE。 网络流媒体传输协议介绍 DASH DASH是一种基于HTTP的自适应流媒体网络传输协议,它允许流媒体内容以多个编码和比特率的形…