[剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

【问题描述】[中等]

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

【解答思路】

1. 单栈

时间复杂度:O(N^2) 空间复杂度:O(1)

在这里插入图片描述

class MinStack {private LinkedList<Integer> data;private int min;/** initialize your data structure here. */public MinStack() {data = new LinkedList<Integer>();min = Integer.MAX_VALUE;}public void push(int x) {if(x <= min){data.add(min);min = x;}data.add(x);}public void pop() {if(data.pollLast() == min){//flush the minmin = data.pollLast();}}public int top() {return data.peekLast();}public int min() {return min;}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.min();*/

Stack

class MinStack {private Stack<Integer> stack;private int min;/** initialize your data structure here. */public MinStack() {stack = new Stack<>();min = Integer.MAX_VALUE;}public void push(int x) {if(x <= min ){//注意:这里要使用<=号stack.push(min);//在每一个min入栈之前将它前一个min入栈min = x;}stack.push(x);}public void pop() {if(stack.pop() == min){//如果取出来的是当前min,就将压在它低下的前一个min出栈min = stack.pop();}}public int top() {return stack.peek();}public int min() {return min;}
}
2. 双栈(辅助栈)

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

class MinStack {Stack<Integer> stack;Stack<Integer> minStack;/** initialize your data structure here. */public MinStack() {stack = new Stack<>();minStack = new Stack<>();minStack.push(Integer.MAX_VALUE);}public void push(int x) {stack.push(x);if(x <= minStack.peek()){minStack.push(x);}}public void pop() {int min = minStack.peek();if(stack.peek() == min){minStack.pop();}stack.pop();}public int top() {return stack.peek();}public int min() {return minStack.peek();}
}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.min();*/
class MinStack {Stack<Integer> A, B;public MinStack() {A = new Stack<>();B = new Stack<>();}public void push(int x) {A.add(x);if(B.empty() || B.peek() >= x)B.add(x);}public void pop() {if(A.pop().equals(B.peek()))B.pop();}public int top() {return A.peek();}public int min() {return B.peek();}
}

【总结】

1.Stack 的常用方法:
push( num) 入栈
pop() 栈顶元素出栈
empty() 判定栈是否为空
peek() 获取栈顶元素
search(num) 判端元素num是否在栈中,如果在返回1,不在返回-1。    注意pop()和peek()的区别。pop()会弹出栈顶元素并返回栈顶的值,peek()只是获取栈顶的值,但是并不会把元素从栈顶弹出来  
2.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操作属于阻塞操作。队满队空均会阻塞。

3.LinkedList
  • 以双向链表实现的LinkedList既是List,也是Queue。
  • 它是唯一一个允许放入null的Queue。
4. 单栈双栈思想均要掌握 面试算法常考题

参考链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/

参考链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/java-jian-ji-wu-fu-zhu-zhan-by-rabbitzhao/

参考链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/shuang-zhan-wei-hu-jie-fa-ji-linkedlistjie-fa-by-c/

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

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

相关文章

C语言-同码小数和

设和式s(d&#xff0c;n)0.d0.dd0.ddd…0.dd…d为n项同码d小数之和&#xff0c;其中第k项小数点后有连续k个数字d&#xff08;d1&#xff0c;2&#xff0c;…&#xff0c;9)。 例如&#xff1a;s&#xff08;7&#xff0c;4&#xff09;0.70.770.7770.7777 还有其他的解法 可…

12.多媒体和超链接标签及其应用实例

多媒体和超链接标签及其应用实例

POJ-3624 Charm Bracelet dp

题意 N个物品每个就一个给出每个物品的价值和花费&#xff0c;表示最终选择一些物品使得花费不超过M&#xff0c;使得价值最大化 分析 最优化问题 考虑dp n个物品选择一些得到最后的最优化问题 我们不妨考虑&#xff0c;假设我们得到了n-1个物品在容量为m情况下最优化值存…

[Leedcode][JAVA][面试题 16.18][模式匹配][字符串][枚举]

【问题描述】[中等] 你有两个字符串&#xff0c;即pattern和value。 pattern字符串由字母"a"和"b"组成&#xff0c;用于描述字符串中的模式。例如&#xff0c;字符串"catcatgocatgo"匹配模式"aabab"&#xff08;其中"cat"是…

C语言实现小数四舍五入

做日记笔记。 转载自https://blog.csdn.net/weixin_38505045/article/details/79994536 排版有更改 C语言中实现四舍五入: (int)(a0.5)即可。 很巧妙的用了取整规则。 也不用导入math.h 同样注意负数的情况。 把 换成 - 即可。 float f ……; int i (int)(f 0.5); i就是f…

CSS效果

效果属性 box-shadow/text-shadow/border-radius/background/clip-path box-shadow 图形阴影 <style type"text/css">.container{width: 50px;height:50px;background: red;box-shadow: 5px 5px 10px rgba(0,0,0,0.5)} </style> <body><div cla…

POJ-1384 Piggy-Bank 多重背包变形

题意 给我们一个容器的容量m n个物品 每个物品有不同的花费和价值 问我们再每个物品无限个的情况下 最后正好装满最后得到的最小价值是多少 如果装不满 就输出impossible 分析 目标状态&#xff1a;最小价值策略 限制条件&#xff1a;正好装满m的容量 多重背包模型 每个物…

13.表格标签及其应用实例

表格标签及其应用实例

1.6解不等式 1.6.1 平方根不等式

//《至美——C程序设计》 在这个前辈的代码上改了一点 S1赋值&#xff0c; s1 1; //赋值 如果提前未赋值会有警告&#xff0c;所以我就想赋值。然后我是在for循环里写的 while (1){m;s 0;s1 1;for (i m; i < 2 * m; i)s sqrt(i); /*对每一个m计算和s*/这会运行结果…

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

【问题描述】[中等] 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序列 {4,5,3,2,1} 是该压栈序列对应的一个弹…

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

【 转载请注明】&#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> #…