【每日刷题】栈与队列-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.hqwc.cn/news/525903.html

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

相关文章

OpenAI GPT LLMs 高级提示词工程方法汇总

原文地址&#xff1a;An Introduction to Prompt Engineering for OpenAI GPT LLMs Github&#xff1a;Prompt-Engineering-Intro 2023 年 3 月 2 日 Naive 提示词&#xff1a;带有提示的情感分类器 prompt Decide whether a Tweets sentiment is positive, neutral, or …

基于ThinkPHP框架的校园一卡通系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 框架技术 3 1.1.1 Bootstrap 3 1.1.2 ThinkPHP框架 3 1.2 前端技术 4 1.2.1 JavaScript 4 1.2.2 ECharts 4 1.3 B/S架构 4 1.4 数据库技术 5 1.4.1 MySQL 5 1.5 本章小结 6 2 系统分析 7 2.1 功能需求分析 7 2.2 非功能需…

每日OJ题_路径dp①_力扣62. 不同路径

目录 力扣62. 不同路径 解析代码 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标…

博士推荐 | 薄膜、涂层技术和液晶材料/器件领域的博士

编辑 / 木子 审核 / 朝阳 伟骅英才 伟骅英才致力于以大数据、区块链、AI人工智能等前沿技术打造开放的人力资本生态&#xff0c;用科技解决职业领域问题&#xff0c;提升行业数字化服务水平&#xff0c;提供创新型的产业与人才一体化服务的人力资源解决方案和示范平台&#x…

SLAM|初识SLAM

在空间中&#xff0c;人可以通过固定不动的事物来作为参考系中的参照物。 而这些固定不动的东西可以称之为特征&#xff0c;空间可以理解成特征存在的空间。 而参照物的意义&#xff0c;可以变成是看到某某参照物&#xff0c;就按这个某某参照物进行位置移动。 比如说碰到这个…

基于Springboot的高校宣讲会管理系统。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校宣讲会管理系统。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【Python】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 Python 目录&#xff1a; &#xff08;一&#xff09;装饰器函数 &#xff08;二&#xff09;牛客网—软件开发-Python专项练习 &#xff08;三&#xff09;time模块

鸿蒙原生应用元服务开发-WebGL网页图形库开发概述

WebGL的全称为Web Graphic Library(网页图形库)&#xff0c;主要用于交互式渲染2D图形和3D图形。目前HarmonyOS中使用的WebGL是基于OpenGL裁剪的OpenGL ES&#xff0c;可以在HTML5的canvas元素对象中使用&#xff0c;无需使用插件&#xff0c;支持跨平台。WebGL程序是由JavaScr…

图|dfs bfs|最小生成树|最短路|一篇搞定图的所有知识点

文章目录 图前言项目代码仓库图的基本概念图的表示方法邻接矩阵邻接表图的一些相关概念 图的遍历bfsdfs如果给的图不是连通图&#xff1f; 最小生成树Kruskal算法Prim算法 最短路径单源最短路径--Dijkstra算法单源最短路径--Bellman-Ford算法多源最短路径--Floyd-Warshall算法 …

代码理解 eq

import torchls2 torch.Tensor([0.2,0.2,0.1])print(ls2.eq(0.2)) print(ls2.eq(0.2).float())

Centos7安装Gogs完整教程

前言 本文章讲的是如何在Centos7下安装git服务器Gogs&#xff0c;本文参考了网络上的文章和官方文档。根据本文来操作可以完美安装Gogs&#xff0c;如果有其他问题或者看法&#xff0c;可以在评论区留下你的问题或看法。如果觉得本文对你有用&#xff0c;还请点赞和收藏一下。…

CorelDRAW Essentials2024使用简单易学的图形软件,让设计充满乐趣

CorelDRAW Essentials 2024使用简单易学的图形软件&#xff0c;让设计充满乐趣 创作引人注目的海报、卡片、社交媒体图片等。 增强功能&#xff01;支持文件导入/导出新增功能&#xff01;支持 WebP 文件&#xff0c;提高网页兼容性并优化图像交付增强功能&#xff01;显著的…