【问题描述】[中等]

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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/

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

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

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

  2. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

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

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

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

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

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

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  6. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

  7. [剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]

    [问题描述][中等] 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C).输入: n = 3 输出: 6 [解 ...

  8. [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]

    [问题描述][简单] 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元 ...

  9. [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]

    [问题描述][中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,给出前序遍历 preorder = [3,9,20,15,7] ...

最新文章

  1. java机试 数据结构_Java数据结构面试题
  2. SBB:长期施肥降低了控制土壤微生物群落演替的随机性
  3. 微服务落地,我们在考虑什么?
  4. 太阳能控制器原理图_太阳能人体感应壁灯的电路设计
  5. HTML5手机端几秒钟自动跳转
  6. Android安全加密:非对称加密
  7. java ssssss_Java 时间字符串(HH:mm:ss.SSS) 转换成毫秒(milliseconds)
  8. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
  9. 搞定ubuntu下环境变量的配置
  10. 数据结构:超好用的数据结构与算法可视化工具(USFCA旧金山大学)
  11. linux cp -ip,linux cp命令
  12. 【开发环境专题一】Maven环境搭建
  13. 成员变量隐藏c语言,C语言中隐藏结构体的细节
  14. 欧洲半导体三巨头的守旧与拓新
  15. Java学习之路 之 容易混淆篇
  16. zoj 3229 Shoot the Bullet(无源汇上下界最大流)
  17. .net(偏web) vs j2ee的一些框架选型
  18. 谷歌联网断网都可以玩的恐龙小游戏(内容有不死加速挂)
  19. C51 汇编和C语言编写从1加到100
  20. 虚拟化之Proxmox VE虚拟机创建及模板制作

热门文章

  1. 【可持久化线段树】【主席树】[HDU4417]Super Mario
  2. webService上传图片
  3. vim下php文件中自动缩排html代码
  4. 实现、设置-Android TabWidget-by小雨
  5. sql数据库连接不上本地数据库的解决办法
  6. MyEclipse2015双击不能打开文件
  7. Mac安装brew及报错处理办法
  8. idea中代码能够运行,但是显示类找不到
  9. Java 操作 HDFS
  10. Oracle集合查询