五、栈与队列(2)

news2024/11/15 9:13:19

五、栈与队列(2)

  • [150. 逆波兰表达式求值 ](https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/)
  • [239. 滑动窗口最大值 ](https://leetcode.cn/problems/sliding-window-maximum/description/)
  • [347.前 K 个高频元素 ](https://leetcode.cn/problems/top-k-frequent-elements/description/)

150. 逆波兰表达式求值

python有坑

  1. .isdigit()只能判断正数没办法判断负数-------用int转换并加try except过掉计算符
  2. python里 / 是向下除而不是向0除--------先浮点除,再取整
    字符串转计算,自己定义一个函数
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        val = 0
        for s in tokens:
            try:
                stack.append(int(s))
            except:
                val = self.calculate(stack.pop(), s, stack.pop())
                stack.append(val)
        if stack: 
            val = stack.pop()  # 单独考虑只有一个元素的时候
        return val

    def calculate(self, b: int, s: str, a: int) -> int:
        if s == '+':
            return a + b
        if s == '-':
            return a - b
        if s == '*':
            return a * b
        if s == '/':
            return int(a/b)




239. 滑动窗口最大值

单调队列头
一个单调减的队列,头始终保存最大的,后面加进来的如果比前面的大,就把前面的都弹出,也就是说,这个数进来以后,之前的小一点的数都不可能成为最大值。
为啥是递减,比如5 3 1 当窗口移动时,5弹出,3就是预备最大的,所以是递减的。
用队列模拟滑动窗口没啥意义,用队列维护可能最大值(预备潜在队员)才有意义.
卡在当滑动窗口时,怎么去掉已经出去的那个元素。分析一下,这个元素有要么比之前的maxnum小,要么等于maxnum。如果比maxnum小,有两种可能,在maxNum之前(排除,因为如果在之前,就会被pop),在之后(排除,之后的话不会有maxnum这个数比他早pop),所以只有唯一一种情况就是等于maxnum,因为比maxnum小的话在之前肯定就被pop掉了。

class Solution:
   def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
       queue = deque()
       queue.append(nums[0])
       maxnum = nums[0]
       ans = []
       for i in range(1, k):
           maxnum = self.maxNumGet(nums[i], queue)
       ans.append(maxnum)
       # print('1:',maxnum)
       for i in range(len(nums)-k):
           # print(nums[i], maxnum)
           if queue and nums[i] == queue[0]: # 其余情况不用管,之前插入的时候已经处理掉了
               queue.popleft()
           # print(queue)
           maxnum = self.maxNumGet(nums[i+k], queue) 
           # print(maxnum,queue)
           ans.append(maxnum)
       return ans 

   
   def maxNumGet(self, val:int, queue: deque) -> int:
       # 插入
       if not queue:  # 当k = 1,queue到这里会变空
           return val  # 只返回值,queue就是空
       if val > queue[0]:  # 等于的时候也留维持期长的,但是如果有两个,遇到第一个就会被删掉
               queue.clear()
               queue.append(val)
       elif val <= queue[-1]:
           queue.append(val)
       else:
           while val > queue[-1]:  # 小于等于都添加,比如 777,这样第一个删掉之后,后面的还在
               queue.pop()
           queue.append(val)
       # 获取
       return queue[0]

灵神思路
单调队列套路
入(元素进入队尾,同时维护队列单调性)
出(元素离开队首)
记录/维护答案(根据队首)
单调队列 = 单调栈 + 滑动窗口(移除队首,左指针后移)
在这里插入图片描述
他的队列是维护列表的下标
在这里插入图片描述
思考:为啥他可以对i x enumerate,当i - q[0] >= k时,弹出。因为只有一种可能需要弹出,就是最大值在队首的时候,后面的都比他小,所以长度就等于滑动窗口的时候,弹出那个出窗口的值也就是当下的最大值。

class Solution:
   def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
       ans = []
       q = deque()
       for i, x in enumerate(nums):
           # 入
           while q and nums[q[-1]] < x:
               q.pop()
           q.append(i)
           # 出
           if i - q[0] >= k:
               q.popleft()

           # 取最大值
           if i >= k - 1:
               ans.append(nums[q[0]])
       return ans  # 注意返回的位置

347.前 K 个高频元素

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素
    优先级队列 前k个最大或者最小
    如果用map来存放频率,再排序得到前k个,时间复杂度是nlog(n)。如果有一个数据结构能够只维护k个 大顶堆(根节点大) 小顶堆 (堆是一棵完全二叉树)
    当push一个元素时,就得pop一个堆顶。如果是大顶堆,pop堆顶是最大的,最后留下的是最小的k个数,如果是小顶堆,顶上小,都弹出,最后留下大的,也就是频率最大的k个,再在map中找到对应的key就是数.
    再来复习一下字典赋值
if x in mapping:
	mapping[x] += 1
else:
	mapping[x] = 1
#  或者直接
mapping[x] = mapping.get(x, 0) + 1

字典遍历是.item(),列表元组是enumerate(),两者都返回一个元组(key/索引,val)
堆 用heappush heappop

import heapq
class Solution:
   def topKFrequent(self, nums: List[int], k: int) -> List[int]:
       # 统计频率
       mapping = {}
       for i, x in enumerate(nums):
           mapping[x] = mapping.get(x, 0) + 1
       # 小顶堆
       minque = []
       for num, freq in mapping.items():
           heapq.heappush(minque,(freq, num))
           if len(minque) > k:
               heapq.heappop(minque)

       ans = [num for freq, num in minque] # 直接返回
       return ans
       
       

heapq.heappush(pri_que, (freq, key)) 中heapq是小顶堆,时间复杂度是log(k),如果想大顶堆,可以把freq取负数。这个是对元组的第一个数进行排序 (freq, key)。
时间复杂度: O(nlogk)
空间复杂度: O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python学习(day1)

1.Python 是大小写敏感的语言。 比如 print 函数名&#xff0c;该函数定义就是全部小写的&#xff0c; 不能写成 Print 或者 PRINT。 2.在Python语言中也会涉及到 对象&#xff0c; 这些对象包含了一定的数据信息。 Python语言中&#xff0c;所有的 数据 都被称之为 对象。 …

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中&#xff0c;我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来&#xff0c;来使用 Traefik 的能力&#xff0c;进行一系列相关的基础设施搭建吧。 本篇文章&#xff0c;聊聊 MinIO 的单独使用&#xff0c;以及结合 Traefik 完成私有化 S3 服务的基础搭建…

C语言:qsort详解

在上一篇文章我们大致的了解了回调函数的用法和作用&#xff0c;在这一篇让我们来了解一下在回调函数qsort的使用吧。 一.qsort qsort是一种用来排各种类型数据的函数&#xff0c;利用的是快速排序的方式。说到排序&#xff0c;我们就想到了之前学习的冒泡排序&#xff0c;但…

MySQL数据如何高效实时同步到Elasticsearch?【送源码】

概述 在实际的项目开发与运维过程中&#xff0c;MySQL 常常扮演着业务数据库的核心角色&#xff0c;以其强大的事务处理能力和数据完整性保障&#xff0c;支撑着系统的稳定运行。然而&#xff0c;随着数据量的急剧增长和查询复杂度的不断提升&#xff0c;单一依赖 MySQL 进行高…

文章管理接口——里面有动态SQL编写,在分页查询里

1.实体类和表结构 2. 新增文章分类 接口文档 实现 完整代码放在校验部分 结果&#xff1a; 参数校验&#xff08;Validation自定义&#xff09; 对state的校验&#xff08;已发布|草稿&#xff09;&#xff0c;已有的注解不能满足校验需求&#xff0c;这时就需要自定义校验注解…

Day30 | 62.不同路径 63. 不同路径 II 343.整数拆分 96不同的二叉搜索树

语言 Java 62.不同路径 不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问…

JVM类加载中的双亲委派机制

【1】什么是双亲委派 Java虚拟机对class文件采用的是按需加载的方式&#xff0c;也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时&#xff0c;Java虚拟机采用的是双亲委派模式&#xff0c;即把请求交由父类处理&#xff0c…

【Git企业级开发实战指南①】Git安装、基本操作!

目录 一、Git是什么&#xff1f;1.1特点1.2功能1.3基本概念 二、Git安装2.1Ubuntu下安装2.2Centos下安装Git 三、Git基本操作3.1创建git本地仓库3.2配置Git3.3 工作区&暂存区&版本库3.4 实操案例3.4.1添加文件 3.5 修改文件3.6版本回退3.7查看历史操作日志3.7撤销修改3…

广东省各区县农业产量数据,数据精度至各区县,2020-2023年四年数据可选!

数据名称: 广东省各区县农业产量数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间&#xff1a;2020-2023年 数据来源&#xff1a;广东省统计年鉴 数据字段&#xff1a; 序号字段名称字段说明1province省份名称2city城市名称3county区县名称4cou…

【C++深度探索】红黑树的底层实现机制

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 红…

VNC未授权访问漏洞

VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏…

STM32F407移植LVGL(V8.3版本)

一、LVGL简述 1.丰富且强大的模块化图形组件&#xff1a;按钮、图表、列表、滑条、图片等 2.高级图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等效果 3.支持多种输入设备&#xff1a;触摸屏、键盘、编码器、按键等 4.配置可裁剪&#xff0c;最低资源占用&am…

latex中Function函数报错

latex写伪码时&#xff0c;发现报错&#xff0c;截图如下&#xff1a; 解决办法&#xff0c;添加宏包&#xff0c;截图如下&#xff1a; \usepackage{algpseudocode}

虚幻引擎 C++ 实现平面阴影

1、平面阴影介绍 平面阴影是一种相对简单的渲染阴影的方式&#xff0c;可以理解为对一个模型渲染两次&#xff0c;一次是渲染模型本身&#xff0c;另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染&#xff0c;可以理解为渲染了一个“压扁”…

pytorch学习笔记6 tensor拼接和拆分

cat 合并 dim必须首选相同&#xff08;上例都是3&#xff09;&#xff0c;其次除了合并的dim&#xff08;上例中为dim0&#xff09;外&#xff0c;其它dim的size必须相同&#xff08;dim 1的size是32&#xff0c;dim2的size是8&#xff09;&#xff0c;否则需要手动处理到相同…

vue3 + Spingboot + oracle 通过Base64存储图片

一 、前言 近期在做vue3 Springboot oracle 的工作&#xff0c;有个小功能通过页面导入图片保存到oracle数据库中&#xff0c;本人对前端不是很熟悉&#xff0c;借此记录一下实现方法&#xff1b; 二、前端部分代码 <template><div class"dialog-mian"&…

SQL注入实例(sqli-labs/less-7)

0、初始页面 1、确定闭合字符 确定闭合字符为单引号括号括号 )) ?id1 and 11 ?id1 and 12 ?id1 ?id1)) 2、查看securie_file_priv参数 ?id1)) and upddatexml(1,concat(0x7e,(select secure_file_priv),0x7e),1) -- 3、写入一句话木马 ?id1)) union select null,&q…

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路

TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好&#xff0c;再与人类的偏好进行对齐&#xff1b; • SFT 只通过 LLMs 生成的下一个单词进行估计&#xff0c;而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计&#xff0c;显然后者的估计会更准确&#xff1b; • 虽然…

壹连科技净利润增速放缓:毛利率清一色下滑,研发费用率远弱同行

《港湾商业观察》施子夫 王璐 从2022年6月20日递表创业板以来&#xff0c;深圳壹连科技股份有限公司&#xff08;以下简称&#xff0c;壹连科技&#xff09;已经走了2年多的历程&#xff0c;如今离挂牌上市近在咫尺。 今年7月22日&#xff0c;壹连科技提交了注册申请。8月2日…

哪个电脑桌面便签好用并且无广告弹窗?

在日常生活和工作中&#xff0c;很多人喜欢在电脑桌面上使用便签软件。便签软件可以方便地记录临时任务、重要信息或者待办事项&#xff0c;帮助用户更好地管理时间和提高工作效率。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速在桌面便签上记下即将要做的任务&a…