[剑指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/
[剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]相关推荐
- [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]
[问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...
- [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]
[问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...
- [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]
[问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...
- [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]
[问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...
- [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]
[问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...
- [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]
[问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...
- [剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]
[问题描述][中等] 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C).输入: n = 3 输出: 6 [解 ...
- [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]
[问题描述][简单] 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元 ...
- [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]
[问题描述][中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,给出前序遍历 preorder = [3,9,20,15,7] ...
最新文章
- java机试 数据结构_Java数据结构面试题
- SBB:长期施肥降低了控制土壤微生物群落演替的随机性
- 微服务落地,我们在考虑什么?
- 太阳能控制器原理图_太阳能人体感应壁灯的电路设计
- HTML5手机端几秒钟自动跳转
- Android安全加密:非对称加密
- java ssssss_Java 时间字符串(HH:mm:ss.SSS) 转换成毫秒(milliseconds)
- js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!
- 搞定ubuntu下环境变量的配置
- 数据结构:超好用的数据结构与算法可视化工具(USFCA旧金山大学)
- linux cp -ip,linux cp命令
- 【开发环境专题一】Maven环境搭建
- 成员变量隐藏c语言,C语言中隐藏结构体的细节
- 欧洲半导体三巨头的守旧与拓新
- Java学习之路 之 容易混淆篇
- zoj 3229 Shoot the Bullet(无源汇上下界最大流)
- .net(偏web) vs j2ee的一些框架选型
- 谷歌联网断网都可以玩的恐龙小游戏(内容有不死加速挂)
- C51 汇编和C语言编写从1加到100
- 虚拟化之Proxmox VE虚拟机创建及模板制作