剑指Offer(第二版)面试题30:包含min函数的栈

来源:互联网 发布:mac搜索文件命令 编辑:程序博客网 时间:2024/06/03 21:08



(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73477461冷血之心的博客)



剑指Offer(第二版)面试题30:包含min函数的栈


题目:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push和pop方法
的时间复杂度均为O(1)


思路:

题目要求我们的各个方法均为O(1)复杂度,则我们考虑增加辅助空间来实现,即增加一个专门用来存储min值的辅助栈。

比如,data中依次入栈,5,  4,  3, 8, 10, 11, 12, 1
则min依次入栈,5,  4,  3,no,no, no, no, 1

no代表此次不如栈
每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则不入栈。


java实现最小栈的代码如下:

import java.util.Stack;/* * 题目:包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push和pop方法 * 的时间复杂度均为O(1) */public class Main {Stack<Integer> stack = new Stack<>();Stack<Integer> minStack = new Stack<>();/** * 首先将值push进普通栈stack中, * 判断是否需要将值放入minStack中 * @param node */public void push(int node) {        stack.push(node);        if(minStack.isEmpty()||minStack.peek()>=node)        minStack.push(node);    }    /** * 首先需要对stack执行出栈操作, * 判断minStack中是否需要出栈操作 */    public void pop() {    stack.pop();    if(stack.peek()==minStack.peek()){    minStack.pop();    }    }        public int top() {        return stack.peek();    }        /**     * 直接peek minStack     * @return     */    public int min() {        return minStack.peek();    }}


需要注意的地方:

该实现算法中,在push和pop操作中,均有判断,判断值相等一定要用peek方法而不是pop!!!切记切记,关键点。



以上实现中,minStack中的个数一般少于当前stack中的个数。比较简单一点。


以下是剑指Offer中提供的思路,个人认为不是特别好。

比如,data中依次入栈,5,  4,  3, 8, 10, 11, 12, 1
则min依次入栈,5,  4,  3,3  , 3 , 3 , 3 , 1

即每次push操作时,如果目标值比minStack栈顶的值大,则将min栈顶的元素再次push进去。(多余是不是?)min函数被调用时,要执行pop操作(太多余了这样?)



牛客网AC地址:

https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking




如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~



本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。