`

Leetcode - Min Stack

 
阅读更多
[分析]
这题属于简单题,之所以要记录下是因为遇到了个不理解的Java语法问题。
在pop()时如果判断条件写成if (minStack.peek() == stack.peek())是要吃WA的,
原因是在表达式中比较的是引用本身,而不是值,奇怪的是在main中我认为一样的情况(e\f这对)判断结果却不同。
在pop()中执行如下两句:
        System.out.println(minStack.peek() + " " + stack.peek());
        System.out.println(minStack.peek() == stack.peek());
第一行打印的是值本身,第二行即使相同值得到的是false,太诡异了。。。
[补充1]
yb君认为e\f和pop()中并不是一种情况,猜测e\f是常量,Java编译时对其进行了优化,使用同一个实例。java中确实有此机制——常量池,以后有时间可以查查编译后的字节码验证下。
从这题得到的教训就是:以后遇到Integer的比较要转为intValue(),这样最保险。

[补充2]
最近才发现leetcode 讨论区帖子可以查看most voted,以前在默认页肉眼搜most voted,服了自己。然后看到这道题目有多种仅适用一个栈的巧妙思路。列举如下:
思路1:最省空间的方案。使用一个栈+一个变量min,栈中保存的是每个元素同它入栈时min的差值x - min, x为入栈元素。push时若x < min,则更新min。pop 和 top时需要额外计算保证算法的正确性。pop出的元素若>=0,说明栈顶元素非最小值,不需要更新min,若 < 0,说明是当前栈中的最小值,更新min=min - pop()。top时若发现栈顶是正数,需返回peek() + min, 若是负数,直接返回min。https://leetcode.com/discuss/15679/share-my-java-solution-with-only-one-stack
思路2:比较清晰的方案,空间换时间。栈中保存元素是自定义的一个类,该类有两个属性,一个是当前元素,一个是当前最小值,不考虑栈本身所占空间,其空间复杂度比两个栈还高。https://leetcode.com/discuss/15679/share-my-java-solution-with-only-one-stack
思路3:比思路1容易理解,空间复杂度和两个栈一样。每次更新min时同时将老的min先入栈,这样每次pop出min时可再pop一个得到新的min。

class MinStack {
    LinkedList<Integer> stack = new LinkedList<Integer>();
    LinkedList<Integer> minStack = new LinkedList<Integer>();
    public void push(int x) {
//        if (minStack.isEmpty() || x <= minStack.peek()) // ok 
        if (minStack.isEmpty() || x <= getMin())  // ok & more safe
            minStack.push(x);
        stack.push(x);
    }

    public void pop() {
        if (stack.isEmpty()) return;
//         if (minStack.peek() == stack.peek()) { // Wrong Answer
        if (minStack.peek().intValue() == stack.peek().intValue()) // ok
        if (getMin() == stack.peek()) // ok & more safe
            minStack.pop();
        stack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
    
    public static void main(String[] args) {
        Integer a = 2;
        Integer b = 2;
        Integer c = new Integer(3);
        Integer d = new Integer(3);
        int e = 4;
        int f = 4;
        System.out.println(a == b);
        LinkedList<Integer> stack1 = new LinkedList<Integer>();
        LinkedList<Integer> stack2 = new LinkedList<Integer>();
        stack1.push(1);
        stack2.push(1);
        System.out.println(stack1.peek() == stack2.peek());
        stack1.push(a);
        stack2.push(b);
        System.out.println(stack1.peek() == stack2.peek());
        stack1.push(c);
        stack2.push(d);
        System.out.println(stack1.peek() == stack2.peek());
        stack1.push(e);
        stack2.push(f);
        System.out.println(stack1.peek() == stack2.peek());
        System.out.println("==========");
        
        MinStack obj = new MinStack();
        obj.push(512);
        obj.push(-1024);
        obj.push(-1024);
        obj.push(512);
        obj.pop();
        obj.getMin();
        obj.pop();
        obj.getMin();
        obj.pop();
        obj.getMin();
    }
}
分享到:
评论

相关推荐

    python-leetcode题解之155-Min-Stack.py

    155题是LeetCode上的一道中等难度的算法题目,主要涉及到设计和实现一个最小栈(Min Stack),要求这个栈除了具备普通栈的基本操作以外,还需要能够返回当前栈中的最小值。 最小栈的实现可以通过多种方法来完成,...

    java-leetcode题解之155-Min-Stack

    public MinStack() { stack = new Stack(); } public void push(int x) { if (stack.isEmpty()) { stack.push(new int[]{x, x}); } else { int currentMin = stack.peek()[1]; stack.push(new int[]{x, ...

    js-leetcode题解之155-min-stack.js

    在JavaScript中实现一个最小栈(Min Stack),是一个常见的算法问题,主要出现在LeetCode等编程练习平台上。在解决这类问题时,我们不仅要实现栈的基本功能,还要添加一个额外的功能:查询... if (this.minStack.length

    java-leetcode面试题解Stack之第155题最小栈-题解.zip

    如果`minStack`为空或x小于`minStack`的栈顶元素,那么`x`也应成为`minStack`的栈顶元素。 3. 执行`pop()`时,两个栈都弹出顶部元素。 4. `top()`操作只需返回`mainStack`的栈顶元素。 5. `getMin()`操作则直接返回`...

    php-leetcode题解之最小栈.zip

    if (empty($this-&gt;minStack) || $x ($this-&gt;minStack)) { $this-&gt;minStack[] = $x; } } // 出栈操作 public function pop() { if (!empty($this-&gt;stack)) { if (end($this-&gt;stack) === end($this-&gt;minStack...

    leetcode卡-abstract-data-type:使用golang实现数据结构

    leetcode卡 abstract-data-type 使用golang实现数据结构 │ main.go │ README.md ├─algorithms ...(https://leetcode-cn.com/explore/learn/card/queue-stack/218/stack-last-in-first-out-data-structu

    leetcode题库-Leetcode-Summary:Leetcode刷题总结(Java版)——更新中

      包含min函数的栈(The_stack_containing_the_min_function.java)   队列的最大值(The_maximum_value_of_the_queue.java) 堆(heap_items)   最小的k个数(The_smallest_k_number.java) 位运算(bit_...

    leetcode-structure:leetcode网站翻译解析,Java各种源码分析

    设计包含最小函数min(),取出元素函数pop(),加入元素函数push()的栈MinStack,实现其中指定的方法(2)。 MinStack中数据存储使用Java原生的Stack,存储数据元素为int。请实现以下对应的方法,完善功能。 ...

    leetcode-Design-1:设计-1

    本题目的两个设计问题分别是设计一个HashMap和一个MinStack。这两个数据结构在实际编程中有着广泛的应用,让我们详细探讨一下它们的设计与实现。 **问题1:设计HashMap** HashMap是一种基于哈希表实现的键值对存储...

    leetcode分类-Leetcode:Leetcode题解

    leetcode 分类 Leetcode代码题解 随缘刷题,选择性更新题解 LeetCode 94 144 145 二叉树的前中后序遍历: Leetcode ...longest-consecutive-sequence ...Min Stack 最小栈: LeetCode 773 滑动谜题: ......

    leetcode包含min函数的栈,python全网时间内存最小解法 代码+思路

    MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --&gt; 返回 -3. minStack.pop(); minStack.top(); --&gt; 返回 0. minStack.min(); --&gt; 返回 -...

    leetcode题库-JavaScript-or-TypeScript-for-LeetCode:使用JavaScript或TypeScrip

    leetcode题库 JavaScript / TypeScript for LeetCode 谨以此仓库记录LeetCode刷题历程【2020.6.27 -&gt; undefined】 使用JavaScript、TypeScript语言解决数据结构和算法问题 锻炼编程能力,培养算法思维,相互学习,...

    java面试-leetcode面试题解之第155题最小栈-题解.zip

    if (minStack.isEmpty() || x &lt;= minStack.peek()) { minStack.push(x); } } public void pop() { if (mainStack.pop().equals(minStack.peek())) { minStack.pop(); } } public int top() { return ...

    LeetCode最全代码

    * [Stack](https://github.com/kamyu104/LeetCode#stack) * [Queue](https://github.com/kamyu104/LeetCode#queue) * [Heap](https://github.com/kamyu104/LeetCode#heap) * [Tree]...

    看leetcode吃力-my-learning-note:大三下学期之资料结构与演算法课程内容与练习

    Min Stack 完成LeetCode 232. Implement Queue using Stacks Week5 完成LeetCode 147. Insertion Sort List 完成作业Quick sort Week6 10/11 国庆弹性放假 Week7 完成作业Heap sort Week8 完成作业Merge sort Week9 ...

    leetcode跳跃-algorithm:leetcode

    minStack stack 111 二叉树的最小深度 , tree 110 平衡二叉树 tree 104 二叉树的最大深度 tree 100 相同的树 tree 94 二叉树的中序遍历 tree 70 爬楼梯 dp 53 最大子序和 dp 26 删除排序数组中的重复项 array 1 两数...

    leetcode316-Every_day_leetcode:Every_day_leetcode

    155.Min Stack 设置一个辅助栈专门用于放置当前最小的值,每次压栈时主栈压入新数据,辅助栈压入当前最小数据 316.Remove 重要 单调栈的问题,栈内元素大致递增,记录下串内字符的数量。有四题大致相同,总结一下...

    leetcode中国-leetcode:刷算法了

    Min Stack 数据结构为两个栈, 一个记录最小值的栈, 一个是存放正常压栈数据 入栈的时候判断新加入的数是否小于或等于最小值栈里的top 出栈时判断出栈数字和最小栈里的是否相等 Evaluate Reverse Polish Notation 逆...

    leetcode答案-algorithmExercise:算法练习

    (min stack), 3.5 (two stack queue) 重要。两道题面M被问到过。3.6 (sort stack)感觉也有可能被考到。 第四章 (4.1, 4.3, 4.5 Leetcode上有): 感觉4.2, 4.3, 4.5,4.6, 4.7 重要。4.5 (valid BST)面E,Q碰到...

    leetcode分发糖果-ForDaFactory:使用C++的个人leetcode解决方案

    leetcode分发糖果 Leetcode C++ Solution Don't try to understand ...155-最小栈:min-stack Tree 普通二叉树 94-二叉树中序遍历:inorder-traversal 100-相同的二叉树:same-tree 101-对称二叉树:symmetric-

Global site tag (gtag.js) - Google Analytics