LeetCode刷题笔记之栈与队列

一、队列与栈相互转换

1. 232【用栈实现队列】

  • 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
    实现 MyQueue 类:
    • void push(int x) 将元素 x 推到队列的末尾
    • int pop() 从队列的开头移除并返回元素
    • int peek() 返回队列开头的元素
    • boolean empty() 如果队列为空,返回 true ;否则,返回 false
      说明:
    • 你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
    • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 代码:
class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackIn = new Stack<>();stackOut = new Stack<>();}public void push(int x) {stackIn.push(x);}public int pop() {if(stackOut.isEmpty()){while (!stackIn.isEmpty()){int temp = stackIn.pop();stackOut.push(temp);}}return stackOut.pop();}public int peek() {int ans = pop();stackOut.push(ans);return ans;}public boolean empty() {if(stackOut.isEmpty() && stackIn.isEmpty()){return true;}return false;}
}

2. 225【用队列实现栈】

  • 题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
    实现 MyStack 类:
    • void push(int x) 将元素 x 压入栈顶。
    • int pop() 移除并返回栈顶元素。
    • int top() 返回栈顶元素。
    • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
      注意
    • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
    • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
  • 代码:
class MyStack {Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1 = new LinkedList<>();q2 = new LinkedList<>();}public void push(int x) {q1.add(x);}public int pop() {int size = q1.size();while(size>1){q2.add(q1.poll());size--;}int ans = q1.poll();while (!q2.isEmpty()){q1.add(q2.poll());}return ans;}public int top() {int ans = pop();q1.add(ans);return ans;}public boolean empty() {if(q1.isEmpty()){return true;}return false;}
}

二、栈的应用

1. 20【有效的括号】

  • 题目: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
    有效字符串需满足:
    • 左括号必须用相同类型的右括号闭合。
    • 左括号必须以正确的顺序闭合。
    • 每个右括号都有一个对应的相同类型的左括号。
  • 代码:
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i<s.length();i++){char c = s.charAt(i);if(c == '('){stack.push(')');}else if(c == '{'){stack.push('}');}else if(c == '['){stack.push(']');}else if(stack.isEmpty() || stack.peek()!=c){return false;}else{stack.pop();}}return stack.isEmpty();}
}

2. 1047【删除字符串中的所有相邻重复项】

  • 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
  • 代码:
    方法一:双指针法
class Solution {public String removeDuplicates(String s) {int slow = 0;StringBuilder sb = new StringBuilder();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if(slow == 0){sb.append(c);slow++;}else if(c != sb.charAt(slow-1)){sb.append(c);slow++;}else{sb.deleteCharAt(slow-1);slow--;}}return sb.toString();}
}

方法二:栈

class Solution {public String removeDuplicates(String s) {Deque<Character> stack = new LinkedList<>();for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if(stack.isEmpty() || stack.peek()!=c){stack.push(c);}else {stack.pop();}}String str = "";while (!stack.isEmpty()) {str = stack.pop() + str;}return str;}
}

3. 150【逆波兰表达式求值】

  • 题目: 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
    请你计算该表达式。返回一个表示表达式值的整数。
    注意:
    • 有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
    • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
    • 两个整数之间的除法总是 向零截断 。
    • 表达式中不含除零运算。
    • 输入是一个根据逆波兰表示法表示的算术表达式。
    • 答案及所有中间计算结果可以用 32 位 整数表示。
  • 代码:
class Solution {public int evalRPN(String[] tokens) {//如果把运算符作为中间节点,将表达式按照中序遍历的规则转换成一个二叉树,//那么逆波兰表达式就是用后序遍历的方式把二叉树序列化的结果。Deque<Integer> stack = new LinkedList<>();for (String s:tokens) {if(s.equals("+")){stack.push(stack.pop()+stack.pop());}else if(s.equals("-")){stack.push(-stack.pop()+stack.pop());}else if(s.equals("*")){stack.push(stack.pop()*stack.pop());}else if(s.equals("/")){int temp = stack.pop();stack.push(stack.pop()/temp);}else{stack.push(Integer.valueOf(s));}}return stack.pop();}
}

三、队列的应用

1. 239【滑动窗口最大值】

  • 题目: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。
  • 代码:
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {//不能使用双指针法,因为如果当前窗口的最大值不在下一个窗口,//则下一个窗口还需重新寻找最大值//因此需要维护一个最大值队列,该队列是递减的//若滑出元素等于队头元素,则需将队头弹出//若滑入元素大于队尾元素,则需将队尾弹出//将滑入元素入队int[] ans = new int[nums.length-k+1];Deque<Integer> queue = new ArrayDeque<>();for (int i = 0; i < nums.length; i++) {while (!queue.isEmpty() && nums[i]>queue.peekLast()){queue.pollLast();}queue.add(nums[i]);if(i-k+1>=0){ans[i-k+1] = queue.peek();if(nums[i-k+1] == queue.peek()){queue.poll();}}}return ans;}
}

2. 347【前K个高频元素】

  • 题目: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按任意顺序返回答案。
  • 代码:
class Solution {public int[] topKFrequent(int[] nums, int k) {//可以使用map来存储每个元素及其对应出现的频率//寻找频率前k个元素,可以使用优先级队列PriorityQueue//PriorityQueue底层使用了堆的数据结构,满足FIFO原则//队头元素只可能是队列中优先级最高的元素//所以这里使用小根堆方式保留出现频率前k个高的元素PriorityQueue<int[]> pq = new PriorityQueue<>(new compareArr());HashMap<Integer,Integer> map = new HashMap<>();int[] ans = new int[k];for (int i = 0; i < nums.length; i++) {map.put(nums[i],map.getOrDefault(nums[i],0)+1);}for(Map.Entry<Integer,Integer> entry:map.entrySet()){int[] temp = new int[2];temp[0] = entry.getKey();temp[1] = entry.getValue();pq.offer(temp);}for (int i = pq.size()-1; i >= 0; i--) {if(i>=k){pq.poll();}else{ans[i] = pq.poll()[0];}}return ans;}
}
class compareArr implements Comparator<int[]>{@Overridepublic int compare(int[] m,int[] n) {return m[1]-n[1];}
}

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

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

相关文章

Java SE入门及基础(5)

变量的定义与使用 1. 变量的概念 从字面意思看&#xff0c;变量就是会变化的量。 从计算机专业角度看&#xff0c;变量就是一个内存空间地址的表示。 在Java中&#xff0c;内存分为栈内存和堆内存两大块 2. 变量的声明 语法 数据类型 变量名 ; 变量名 变量值…

Python笔记07-异常、模块和包

文章目录 异常及捕获方法python模块python包安装第三方包 异常及捕获方法 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG 例如&#xff1a;以r方式打开一个不存在的…

LNMP架构及应用部署

目录 简介 1、构建LNMP网站平台 1.1、安装MySQL数据库 &#xff08;1&#xff09;编译安装MySQL &#xff08;2&#xff09;优化调整 &#xff08;3&#xff09;初始化数据库 &#xff08;4&#xff09;启动mysql服务 1.2、安装PHP解析环境 &#xff08;1&#xf…

【pytorch学习】 深度学习 教程 and 实战

pytorch编程实战博主&#xff1a;https://github.com/lucidrains https://github.com/lucidrains/vit-pytorch

K8S-环境部署

1 基础环境配置 主机名规划 序号主机ip主机名规划110.0.0.12kubernetes-master.sswang.com kubernetes-master210.0.0.15kubernetes-node1.sswang.com kubernetes-node1310.0.0.16kubernetes-node2.sswang.com kubernetes-node2410.0.0.17kubernetes-node3.sswang.com kubern…

【Java】设计模式之两阶段终止

两阶段终止 两阶段终止&#xff0c;即Two Phase Termination。是用来终止线程的套路。 它的思想是&#xff0c;如何在一个线程T1中优雅地终止线程T2&#xff1f;这里的【优雅】指的是给T2一个料理后事的机会。 错误思路&#xff1a; 使用stop方法。stop 方法会真正杀死线程…

uniapp上传文件时用到的api是什么?格式是什么?

在UniApp中&#xff0c;你可以使用uni.uploadFile()方法来上传文件。这是一个异步方法&#xff0c;用于将本地资源上传到服务器。 该方法的基本格式如下&#xff1a; uni.uploadFile({url: 上传接口地址,filePath: 要上传的文件路径,name: 后端接收的文件参数名,formData: {/…

58. 最后一个单词的长度(Java)

题目描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 输入&#xff1a; s “luffy is still joyboy” 输出&#xff1a; 6 解释&am…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

“华为杯“第十三届中国研究生数学建模竞赛-A题:关于跳台跳水体型系数设置的建模分析(续)

目录 5.4.1 问题分析与建模 5.4.2 计算与求解 5.5 结论 5.5.2 当空中存在两个动作时

双指针算法,python求解给定数组的三数之和问题

对于双指针算法&#xff0c;一般是用于解决对数组等数据结构进行遍历的问题的一种编程思路&#xff0c;其主要是使用两个指针共同配合工作&#xff0c;对数组等数据结构进行搜索并返回得到想要搜索的结果&#xff0c;针对给定问题&#xff0c;三数之和问题&#xff0c;这是一个…

Java集合框架深度解析:HashSet

Java集合框架是Java编程中不可或缺的一部分&#xff0c;提供了丰富的数据结构和算法&#xff0c;以支持各种场景下的数据存储和操作。在这个系列的深度解析中&#xff0c;我们将聚焦于其中之一的**HashSet**&#xff0c;深入了解它的实现原理、使用场景、可能遇到的问题以及并发…

Vue实现加减法验证码

引入Vue.js 在HTML文件的<head>标签中引入Vue.js的CDN链接&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.6.11/dist/vue.min.js"></script>创建Vue实例 接下来&#xff0c;我们要创建一个Vue实例&#xff0c;并将其挂载到HTML文…

HTTP一些状态码的记录

首先先理解一下什么是HTTP,HTTP&#xff08;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 从100开始到500的一些状态码 一&#xff0c;1xx&#xff08;信息性状态…

特斯拉难挽倒退?比亚迪为中国汽车市场改写历史

对于电动汽车这个新兴产业&#xff0c;特斯拉长期以来一直处于领头羊的位置&#xff0c;近年来也面临诸多测试。去年底欧洲报道特斯拉在瑞典遭遇罢工冲击&#xff0c;运营陷入诸多困扰&#xff0c;实在出人意料。更让人讶异的是&#xff0c;年终宣布新王者比亚迪在全球销量首次…

图表分析网页模版 大数据可视化大屏电子沙盘合集

项目基于html/css/js&#xff0c;包含行业&#xff1a; 智慧政务 智慧社区 金融行业 智慧交通 智慧门店 智慧大厅 智慧物流 智慧医疗 通用模板 大数据分析平台 项目包含功能 (部分)&#xff1a; 实时数据K线图&#xff08;可自由配置多种行业模式&#xff09; 可切换式大屏展…

私有仓库Gogs搭建(docker环境)

文章目录 环境准备Gogs简介MYSQL(docker) 搭建gogs(docker) 部署gogs初始化配置配置管理员信息仓库创建项目代码上传仓库 环境准备 本地环境安装git,参考Git分布式版本控制工具学习管理面板1panel&#xff0c;安装参考Armbian安装1panel教程服务器docker环境&#xff08;如果使…

Spring Boot 基础知识点1 (含面试题1)

Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具&#xff0c;它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序&#xff0c;并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到…

【树莓派安装Homeassistant及基本配置】

【树莓派安装Homeassistant及基本配置】 前言1. 树莓派安装Homeassistant1.1 建议的硬件1.2 安装家庭助理操作系统1.2.1 将映像写入 SD 卡1.2.2 如果需要WiFi连接1.2.3 访问家庭助理 1.3 配置环境1.3.1 创建账号1.3.2 设置位置1.3.3 设置国家1.3.3 数据设置 1.4 更新系统1.5 打…

人类智能中含有不同态、势、感、知的混合微积分

人类智能中包含了不同态、势、感、知的混合微积分。在混合微积分中&#xff0c;不同态代表了人类在不同的状态下对问题的思考和处理能力&#xff0c;势代表了人类在不同的动机和目标驱动下的行为表现&#xff0c;感代表了人类对问题的感觉和理解反应&#xff0c;知代表了人类对…