【每日刷题】栈与队列-LC394、LC347、LC215

题外话:感觉脑子没长到栈这块…最近刷栈的题都好难啊…哭哭…坚持坚持!多刷几遍就好了!!

1. LC394.字符串解码

题目链接

先说数据结构。
维护两个栈:一个栈存之前的字符串,另一个栈存之后的字符串的重复次数(数字)
维护两个变量:res表示目前遍历到的字符组成的字符串,k表示遍历到的数字组成的数字

工作原理:
最开始的字符串为""。
遇到字符时:存到res里。
遇到数字时:存到k里。
遇到左括号:把左括号前面的字符串,以及左括号内要循环的次数(数字),分别入栈,即res和k入栈。然后res和k重置。
遇到右括号:说明此时的res为最小单位,将数字栈里的栈顶元素出栈,这个数字将是res循环的次数。然后将字符串栈里的栈顶元素出栈,这个元素是括号前的字符串,后面需要拼接res。拼接后,形成新的res。不入栈。等遇到左括号再入栈。

例:
3[a2[c]] 看成 ""3[a2[c]]

图片版:
在这里插入图片描述

文字版:
在这里插入图片描述
代码
注意当字符是数字字符的处理逻辑。

  1. c >= '0' && c <= '9' 来确定当前字符是不是数字字符
  2. c-'0' 得到当前字符代表的数字,将字符转为数字
  3. k = k * 10 + (c-'0'); 这个也很妙。如果k已经有数字了,例如k已经等于12了,这时又遍历到3,那么就是k*10再加上当前的数字,123。
class Solution {public String decodeString(String s) {int k = 0;StringBuilder res = new StringBuilder();Stack<StringBuilder> stack_Res = new Stack<>();Stack<Integer> stack_K = new Stack<>();for (char c : s.toCharArray()){if (c >= '0' && c <= '9'){k = k * 10 + (c-'0');}else if (c == '['){stack_Res.push(res);stack_K.push(k);res = new StringBuilder();k = 0;}else if (c == ']'){int count = stack_K.pop();StringBuilder temp = new StringBuilder();for (int i=0; i<count; i++){temp.append(res);}res = stack_Res.pop().append(temp);}else{res.append(c);}}return res.toString();}
}

2. LC347、前K个高频元素

题目链接
解法一:

  1. 遍历一遍,建立哈希表存储数字与出现频次的映射。
  2. 维护一个元素数目为k的小顶堆。(堆中存放的是元素,但是priority queue可以按照自定义顺序排序,自定义顺序为:元素的频次)。
  3. 当有新元素来的时候,与堆顶元素作比较,若频次比堆顶元素大,则该元素应放到前k个高频元素中,所以堆顶元素出队列,该元素加队列。堆会自动按定义顺序排序。
  4. 最终堆中的元素就是前K个高频元素。

时间复杂度:
建立哈希表:n;小顶堆本身维护:logk;遍历哈希,维护小顶堆:nlogk;遍历堆存进数组:k
所以整体时间复杂度为O(nlogk)

空间复杂度:
哈希表:n,小顶堆:k。
所以整体空间复杂度为O(n)

class Solution {public int[] topKFrequent(int[] nums, int k) {//建立哈希表维护 数值与频次 的键值对Map<Integer, Integer> map = new HashMap<>();for (int i : nums){if (map.containsKey(i)){map.put(i, map.get(i)+1);}else{map.put(i, 1);}}//定义PriorityQueue存放前k个高频元素PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){@Overridepublic int compare(Integer a, Integer b){return (map.get(a) - map.get(b));}});//遍历map,更新堆for (Integer key: map.keySet()){if (queue.size() < k){queue.offer(key);}else{if (map.get(key) > map.get(queue.peek())){queue.poll();queue.offer(key);}}}//输出堆元素int[] array = new int[k];for (int i=0; i<k; i++){array[i] = queue.poll();}return array;}
}

解法二:

  1. 遍历一遍,建立哈希表存储数字与出现频次的映射。
  2. 将Map.entrySet<>存放进list,list排序,按照自定义规则排序(按照频次,即value值从大到小排序)
  3. 获取list中前k个元素的key值

时间复杂度:
建立哈希表:n;放进list:n;sort方法排序:nlogn;遍历堆存进数组:k
所以整体时间复杂度为O(nlogn)

空间复杂度:
O(n)

class Solution {public int[] topKFrequent(int[] nums, int k) {//建立哈希表维护 数值与频次 的键值对Map<Integer, Integer> map = new HashMap<>();for (int i : nums){if (map.containsKey(i)){map.put(i, map.get(i)+1);}else{map.put(i, 1);}}//将entryset放进list,对list进行排序List<Map.Entry<Integer, Integer>> list = new ArrayList<>();for (Map.Entry<Integer, Integer> entry: map.entrySet()){list.add(entry);}Collections.sort(list, (list1, list2) -> list2.getValue() - list1.getValue());//获取前k个值int[] array = new int[k];for (int i=0; i<k; i++){array[i] = list.get(i).getKey();}return array;}
}

3. LC215.数组中的第k个最大元素

题目链接

用优先级队列方法做。
PriorityQueue,peek()方法返回的是堆顶元素,poll()方法移除的也是堆顶元素,offer()方法把元素插入队列末尾,队列会根据自定义实现排序。
所以我们考虑使用大顶堆还是小顶堆呢?
因为poll和peak针对的是堆顶元素,所以我们每次新来一个元素若想加入堆,都必须要移除堆顶的元素。如果是大顶堆的话,堆顶是最大的元素,但显然最大的元素不能被移除。所以我们要用小顶堆。若新来的元素比堆顶的大,则移除堆顶元素,把新元素加入进来。这样可以实现最后得到的大顶堆是前k个最大元素。堆顶就是第k个最大元素

代码
注意:

  1. 优先级队列的定义,还是要熟悉,尤其是里面的comparator怎么写
  2. 只有当新元素大于堆顶,而非大于等于时,才将新元素加入进来。比如考虑655,5是第二大元素,无论哪个5都是第二大元素,但如果两个5都加到堆里来的话,那堆里就有三个元素了,就成前3大元素了。所以加入堆的条件不能是等于。
  3. 基本类型转包装类,包装类转基本类型,必须熟记。
class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){public int compare(Integer a, Integer b){return a.intValue() - b.intValue();}});int index = 0;for (int i: nums){if (index < k){queue.offer(Integer.valueOf(i));}else{if (i > queue.peek()){queue.poll();queue.offer(Integer.valueOf(i));}}index++;}return queue.peek();}
}

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

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

相关文章

基于命名实体链接的事件抽取与知识图谱在电商领域的应用

开源项目推荐 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口…

RuntimeError: Unable to find a valid cuDNN algorithm to run convolution

这个错误通常出现在尝试使用cuDNN&#xff08;CUDA Deep Neural Network库&#xff09;进行卷积运算时&#xff0c;但cuDNN没有找到一个合适的算法来执行这个运算。这可能是由以下几个原因导致的&#xff1a; CUDA和cuDNN版本不兼容&#xff1a;确保你安装的CUDA和cuDNN版本是相…

Linux: 网络: ipsec ipv6 mtu问题一例

最近遇到一个问题 将ipv6的MTU设置为1300,然后从在IPv6层之上再添加一个ipsec/esp层。 同时上层应用有大量的数据发出来,触发最大MSS发送数据,这个时候就会出现自己给自己发送packet too big ICMPv6的消息。 产生这个错误的原因和一个commit相关,下面这个commit说了一个情…

mysql | 查询数据的过程|优化-->索引 |存储引擎

查询的过程 首先确认mysql 服务器是否启动 systemctl mysqld status 登录连接 mysql -h i p − u ip -u ip−uuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码) mysql 数据包 经过抓包分析&#xff08;mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议&#xff0…

云原生构建 微服务、容器化与容器编排

第1章 何为云原生&#xff0c;云原生为何而生 SOA也就是面向服务的架构 软件架构的发展主要经历了集中式架构、分布式架构以及云原生架构这几代架构的发展。 微服务架构&#xff0c;其实是SOA的另外一种实现方式&#xff0c;属于SOA的子集。 在微服务架构下&#xff0c;系统…

Web本体语言OWL

语义网&#xff08;Semantic Web&#xff09;&#xff1a; 语义网是万维网联盟&#xff08;W3C&#xff09;提出的一种愿景&#xff0c;旨在增强现有Web的表达能力和智能处理能力&#xff0c;通过标准化的技术手段赋予网络数据更加精确和可计算的语义&#xff0c;使得机器能够…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要&#xff0c;接触了下React Native相关的知识&#xff0c;以一个Android开发者的视角&#xff0c;对React Native 项目组织和构建流程有了一些粗浅的认识&#xff0c;同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

西门子PLC中的程序块及类别详解

在PLC的编程中&#xff0c;程序块是指一组逻辑控制代码&#xff0c;用于实现系统中特定的控制功能。程序块主要分为四类&#xff0c;包括函数块&#xff08;FB&#xff09;、函数&#xff08;FC&#xff09;、数据块&#xff08;DB&#xff09;和组织块&#xff08;OB&#xff…

300分钟吃透分布式缓存-24讲:Redis崩溃后,如何进行数据恢复的?

Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF&#xff0c;以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在需要进行 RDB 持久化时&#xff0c;Redis 会将内存中的所有数据以二进制的格式落地&#xff0c;每…

Python算法题集_在排序数组中查找元素的第一个和最后一个位置

Python算法题集_在排序数组中查找元素的第一个和最后一个位置 题34&#xff1a;在排序数组中查找元素的第一个和最后一个位置1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【二分法两次左边界】2) 改进版一【二分法左右边界】3) 改进版二【第三…

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

寻找完全平方数——浮点数陷阱

【题目描述】 输出所有形如aabb的4位完全平方数&#xff08;即前两位数字相等&#xff0c;后两位数字也相等&#xff09;。 【解析】 一、问题分析 从问题出发&#xff0c;题目要求输出的是满足一定条件的数。数在计算机中是要占存储空间的&#xff0c;要在计算机中表示一个…

L1-035 情人节

以上是朋友圈中一奇葩贴&#xff1a;“2月14情人节了&#xff0c;我决定造福大家。第2个赞和第14个赞的&#xff0c;我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单&#xff0c;请你找出那两位要请客的倒霉蛋。 输入格式&#xff1a; 输入按照点赞…

C语言字符串型常量

在C语言中&#xff0c;字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号&#xff08;"&#xff09;括起来&#xff0c;例如&#xff1a;“Hello, World!”。字符串常量在C中是不可变的&#xff0c;也就是说&#xff0c;一旦定义&#xff0c;就不能修改其内…

Web自动化测试流程:从入门到精通,帮你成为测试专家

摘要&#xff1a; Web应用程序在今天的软件开发中占据着越来越重要的地位。保证Web应用程序的质量和稳定性是非常必要的&#xff0c;而自动化测试是一种有效的方法。本文将介绍Web自动化测试流程&#xff0c;并提供代码示例。 步骤一&#xff1a;选取测试工具 选择适合自己团…

探讨代理IP在大数据收集、网络营销中的战略角色

代理IP在大数据收集和网络营销中扮演着至关重要的战略角色&#xff0c;其主要体现在以下几个方面&#xff1a; 1. 避免IP限制与反爬机制&#xff1a; - 在大数据收集过程中&#xff0c;尤其是网络爬虫抓取数据时&#xff0c;目标网站通常会设置访问频率限制或IP封锁策略以防止恶…

Linux作业调度和服务管理

目录 作业调度 调整进程的优先级 服务管理 systemd管理服务操作 systemd管理target&#xff08;一点点&#xff09; 作业调度的本质仍然是进程&#xff0c;之所以叫做作业调度&#xff0c;作业是以shell为单位的&#xff0c;一个shell建立的作业&#xff0c;不会被另外一个…

12 数据库安全和管理

文章目录 数据库安全和管理表的复制数据库备份MySQL远程连接添加用户和授权 数据库安全和管理 表的复制 表能根据实际需求复制数据复制表时不会把KEY属性复制过来 语法 create table 表名 select 查询命令;create table student select name,age,score from class where sc…

像SpringBoot一样使用Flask - 5.统一处理(日志、异常、响应报文)

接上文《像SpringBoot一样使用Flask - 4.拦截器》&#xff0c;通过拦截器处理一些日志&#xff0c;异常、还有统一的响应报文。 统一的目的就是为了让前后端调用请求不会因为各自习惯而随意编写&#xff0c;增加技术人员快速上手及代码的可阅读性。 一、定义一个返回类。是不是…

ZigBee技术与实践教程(持续更新笔记)

1.安全性 802.15.4 在数据传输过程中提供了三级安全性。 &#xff08;1&#xff09;第一级实际是无安全性方式&#xff0c;对于某种应用&#xff0c;如果安全性并不重要或者上一层已经提供了安全性保护&#xff0c;器件就可以采用这种方式来转移数据。 &#xff08;2&#x…