程序员面试经典--返回栈中最小元素
来源:互联网 发布:centos 安装 nginx 编辑:程序博客网 时间:2024/06/18 04:39
3.2问题:
请设计一个栈,除去pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。
思考:
一种解法是,在Stack类里添加一个int型的minvalue。当minvalue出栈时,我们会搜索整个栈,找出新的最小值。可惜,这不符合入栈出栈时间复杂度O(1)的要求。另一种解法,就是每次入栈都要记下这个状态下的最小值。
import java.util.*;class StackMin{public static void main(String args[]){StackWithMin a = new StackWithMin();a.push(6);System.out.println(a.min());a.push(5);System.out.println(a.min());a.push(4);System.out.println(a.min());a.push(3);System.out.println(a.min());a.push(2);System.out.println(a.min());a.push(1);System.out.println(a.min());a.push(2);System.out.println(a.min());a.push(3);System.out.println(a.min());}}class StackWithMin extends Stack<NodeWithMin> {public void push(int value){int newMin = Math.min(value,min());super.push(new NodeWithMin(value,newMin));}public int min(){if(this.isEmpty()){return Integer.MAX_VALUE;//如果为空的话,返回极限大值。}else{return peek().min; //返回栈顶元素的绑定的最小值。}}}class NodeWithMin{public int value;public int min;public NodeWithMin(int v,int min){value = v;this.min=min;}}
以上做法有个缺点,当栈很大的时候,每个元素都要记录min,就会浪费大量的空间。
下面一个方法可以节省空间:
import java.util.*;class StackMin{public static void main(String args[]){StackWithMin a = new StackWithMin();a.push(6);System.out.println(a.min());a.push(5);System.out.println(a.min());a.push(4);System.out.println(a.min());a.push(3);System.out.println(a.min());a.push(2);System.out.println(a.min());a.push(1);System.out.println(a.min());a.push(2);System.out.println(a.min());a.push(3);System.out.println(a.min());System.out.println("开始你的表演:");a.pop();System.out.println(a.min());a.pop();System.out.println(a.min());a.pop();System.out.println(a.min());a.pop();System.out.println(a.min());a.pop();System.out.println(a.min());}}class StackWithMin extends Stack<Integer> {Stack<Integer> s2;public StackWithMin(){s2 = new Stack<Integer>();}public void push(int value){if(value<=min()){s2.push(value);}super.push(value);}public Integer pop(){int value =super.pop();if(value==min()){//如果弹出的值是当前最小值,则s2也弹出一个值。s2的栈底到栈顶必定是数字从大到小排列s2.pop();}return value;}public int min(){if(s2.isEmpty()){return Integer.MAX_VALUE;//如果为空的话,返回极限大值。}else{return s2.peek(); //返回栈顶元素的绑定的最小值。}}}
0 0
- 程序员面试经典--返回栈中最小元素
- 栈中最小元素
- 程序员面试之 二分搜索 旋转数组的最小元素
- 高度最小的BST之程序员面试经典
- 程序员面试经典--创建最小二叉查找树
- 返回局部最小元素
- 程序员面试经典--栈排序
- 《Cracking the Coding Interview程序员面试金典》----下一个较大元素(所有比他大中最小的)
- 程序员面试金典: 9.3栈与队列 3.2设计一个栈,除pop与push方法,支持返回栈最小元素min方法,时间复杂度均为O(1)
- Min栈——用O(1)时间复杂度返回当前栈中最小元素
- 【C++】返回栈中最小的元素,要求时间复杂度为O(1)
- 求出栈中最小元素
- H面试(22):设计一个栈,能输出当前栈中最小元素
- [经典面试题]排序数组中绝对值最小元素
- 集合栈之程序员面试经典
- 双栈排序之程序员面试经典
- 程序员面试经典--栈实现堆盘子
- 程序员面试经典--用栈实现队列
- Java重载,继承,覆盖
- (七)ReactNative实现二维码扫描
- Apache和Nginx的优缺点比较.
- 编写自己的CMFCEditBrowseCtrl,实现打开指定类型的文件
- ros 编写 helloworld 程序
- 程序员面试经典--返回栈中最小元素
- IO流
- 选择一张图片然后在图片上根据手指移动绘图,然后保存到SD卡
- 在ubuntu加载vim时出错
- IntelliJ IDEA 的Project structure说明(转载)
- Android端公司通讯录开发与实现(二)
- 基于Token的WEB后台认证机制
- 《统计学习方法》第八章提升方法学习笔记
- ajax传递给后台数组参数方式