[剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

【问题描述】[中等]

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。提示:0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。

【解答思路】

在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack = new Stack<>();//入栈数组的指针,必须维护,才知道此时应该是哪个数入栈int pushIndex = 0;//遍历要出栈的数组,如果可以全部出栈成功,那么返回TRUEfor (int poppedIndex = 0; poppedIndex < popped.length; ++poppedIndex) {//这个条件很关键,当 还有数可以入栈 && (栈为空,那么直接入栈,或者栈顶元素与要弹出的数不一样,那么继续入栈)while (pushIndex < pushed.length && (stack.empty() || stack.peek() != popped[poppedIndex]))stack.push(pushed[pushIndex++]);//能走到这里,要么没有数可以继续入栈了,要么此时的栈顶元素和要弹出的数一致//如果栈顶元素和要弹出的数不一致,那么直接返回FALSE,因为正如上面所说,能走到这里还可能是因为没有数可以继续入栈了if (stack.peek() != popped[poppedIndex])return false;//如果一致,那么出栈elsestack.pop();}//走到这里说明全部出栈成功,那么返回TRUEreturn true;}
}

优化

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack = new Stack<>();int i = 0;for(int num : pushed) {stack.push(num); // num 入栈while(!stack.isEmpty() && stack.peek() == popped[i]) { // 循环判断与出栈stack.pop();i++;}}return stack.isEmpty();}
}

使用 Deque 双端队列来代替 Stack

public boolean validateStackSequences(int[] pushed, int[] popped) {Deque<Integer> stack = new LinkedList<>();int idx = 0;for (int num : pushed) {stack.offerFirst(num);while (!stack.isEmpty() && stack.peekFirst() == popped[idx]) {stack.pollFirst();idx++;}}return stack.isEmpty();}

【总结】

1.边界问题 注意越界 栈 先入先出 边入边出思想 辅助栈思想
2. 使用 Deque 双端队列来代替 Stack

基于 Vector 实现的栈 Stack底层是数组 扩容开销大
Java并不推荐使用java.util.stack来进行栈的操作,而是推荐使用一个双端队列deque
详情链接:https://www.cnblogs.com/cosmos-wong/p/11845934.html

3.Stack 的常用方法:
push( num) 入栈
pop() 栈顶元素出栈
empty() 判定栈是否为空
peek() 获取栈顶元素
search(num) 判端元素num是否在栈中,如果在返回1,不在返回-1。    注意pop()和peek()的区别。pop()会弹出栈顶元素并返回栈顶的值,peek()只是获取栈顶的值,但是并不会把元素从栈顶弹出来  
4.Queue


Queue是在两端出入的List,所以也可以用数组或链表来实现。

  • add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  • remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  • offer 添加一个元素并返回true 如果队列已满,则返回false
  • poll 移除并返问队列头部的元素 如果队列为空,则返回null
  • peek 返回队列头部的元素 如果队列为空,则返回null
  • put 添加一个元素 如果队列满,则阻塞
  • take 移除并返回队列头部的元素 如果队列为空,则阻塞
注意
  • remove、element、offer 、poll、peek 其实是属于Queue接口。

  • add remove element操作在队满或者队空的时候会报异常。

  • offer poll peek 在队满或者队空的时候不会报异常。

  • put take操作属于阻塞操作。队满队空均会阻塞。

5.LinkedList
  • 以双向链表实现的LinkedList既是List,也是Queue。
  • 它是唯一一个允许放入null的Queue。

转载链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya-ru-dan-chu-xu-lie-mo-n-2/

参考链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/javazhan-shi-xian-yi-ji-zhi-zhen-mo-ni-zhan-liang-/

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

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

相关文章

《七哥说道》第二章:初出茅庐之拜师学艺

【 转载请注明】&#xff1a; 原文出处&#xff1a;https://www.cnblogs.com/jstarseven/p/10499659.html 作者&#xff1a;jstarseven 码字挺辛苦的..... 怀着对第一份工作的遐想&#xff0c;15年6月1号&#xff08;儿童节啊&#xff09;&#xff0c;我开始了我的入职之旅。北…

hihocoder A Game 区间dp

题意 一个数串 A和B每人从这个数串的第一个或者最后一个元素选择一个数加到自己的得分里&#xff0c;A先选&#xff0c;求先手最大得分 样例&#xff1a; 4 -1 0 100 2 输出 99 分析 对于任意一个区间段 我们考虑的问题是相似的 不论任何区间段都是考虑取前面的还是取…

[Leedcode][JAVA][第67题][二进制求和][位运算][字符串]

【问题描述】[简单] 给你两个二进制字符串&#xff0c;返回它们的和&#xff08;用二进制表示&#xff09;。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a "11", b "1" 输出: "100" 示例 2:输入: a "1010", b "1…

解不等式之代数和不等式

代数和概念&#xff1a;数学用语。将数(实数)的加减法算式视为省略加号的几个有理数的和&#xff0c;称这个算式的结果为这几个有理数的代数和。 试解下列关于正整数n的代数和不等式&#xff1a; d < 11/2-1/31/41/5-1/61/n 其中d为从键盘输入的正数&#xff0c;式中代数和…

15.jsp简介

JSP 简介 什么是Java Server Pages? JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发者…

wamp

进入localhost找不到项目文件 转载于:https://www.cnblogs.com/nzc520/p/10501528.html

POJ-1050 To the Max 二维最大子段和

题意 给我们一个二维矩阵 让我们在找出其中的最大子矩阵和 分析 对输入的一个矩阵 我们考虑一维线性矩阵 上的最大子段和 对于一个数串 我们的选择策略是 res max&#xff08;res,max( suma[ i ], a[ i ] )&#xff09;; res就是最后我们得到的最大子段和的结果 a[i]是…

16.jsp结构

JSP 结构 网络服务器需要一个 JSP 引擎&#xff0c;也就是一个容器来处理 JSP 页面。容器负责截获对 JSP 页面的请求。本教程使用内嵌 JSP 容器的 Apache 来支持 JSP 开发。 JSP 容器与 Web 服务器协同合作&#xff0c;为JSP的正常运行提供必要的运行环境和其他服务&#xff…

将一个5X5的矩阵中最大的元素放在中心, 4个角分别放4个最小的元素(顺序为从左到右,从上到下,从小到大存放)其余数字从小到大

将一个5X5的矩阵中最大的元素放在中心&#xff0c; 4个角分别放4个最小的元素&#xff08;顺序为从左到右&#xff0c;从上到下&#xff0c;从小到大存放&#xff09; 其余数字从小到大 在以前的要求上更改了一下&#xff0c;其余数字从小到大排序 #include <stdio.h> #…

[剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

【问题描述】[中等] 从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回&#xff1a;[3,9,20,15,7]【解答思路】 BFS 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a…

HDU 4403 A very hard Aoshu problem DFS

problem statement 这道题给我们一个不超过15位的整数 让我们在其中加等号或者加号 如果加完符号后符合计算结果 那么计数 最后输出所有的情况 problem analysis 这道题其实就是想办法遍历所有情况 把合法的记录下来 最终输出就得到解 如何枚举呢 我们可以枚举等号的位置…

计算机网络考试题库

计算机网络考试题库 第一章 一、单项选择题 1、计算机网络可以被理解为&#xff08; B &#xff09; A.执行计算机数据处理的软件模块 B.由自治的计算机互联起来的集合体 C.多个处理器通过共享内存实现的紧耦合系统 D.用于共同完成一项任务的分布式系统 2、计算机网络最基本的功…

《深入理解Java虚拟机》读书笔记一

第二章 Java内存区域与内存溢出异常 1、运行时数据区域 程序计数器&#xff1a; 当前线程所执行的字节码的行号指示器&#xff0c;用于存放下一条需要运行的指令。运行速度最快位于处理器内部。线程私有。虚拟机栈&#xff1a; 描述的是Java方法执行的内存模型&#xff0c;用于…

[Leedcode][JAVA][第16题][最接近的三数之和][双指针][数组]

【问题描述】[中等] 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&…

LIS 的 n*log 算法 ———二分维护

upper_bound只会替换让留在数组里的最长递增子序列尽可能小 由于upper查出来的结果下标是那个可以插入这个值得最后一个元素 所以他会把大的数变成小的数 upper将可以替换成新元素的元素替换成更小的 将不能替换的元素 大的元素直接放在最后面 很神奇 你会发现 这个问题 …

[剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

【问题描述】[简单] 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回其层次遍历结果&#xff1a;[[3],[9,20],[15,7] ]【解答思路】 层次遍历 BFS 时…

爬虫入门-3.初识BeautifulSoup

一.安装BeautifulSoup BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.BeautifulSoup配合Request使用&#xff0c;能大大提高爬虫效率。 pip install BeautifulSoup 二.常见操作 from bs4 impor…