[分析]
这题属于简单题,之所以要记录下是因为遇到了个不理解的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();
}
}
分享到:
相关推荐
java入门 java_leetcode题解之155_Min_Stack
python python_leetcode题解之155_Min_Stack.py
如果`minStack`为空或x小于`minStack`的栈顶元素,那么`x`也应成为`minStack`的栈顶元素。 3. 执行`pop()`时,两个栈都弹出顶部元素。 4. `top()`操作只需返回`mainStack`的栈顶元素。 5. `getMin()`操作则直接返回`...
if (empty($this->minStack) || $x ($this->minStack)) { $this->minStack[] = $x; } } // 出栈操作 public function pop() { if (!empty($this->stack)) { if (end($this->stack) === end($this->minStack...
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
包含min函数的栈(The_stack_containing_the_min_function.java) 队列的最大值(The_maximum_value_of_the_queue.java) 堆(heap_items) 最小的k个数(The_smallest_k_number.java) 位运算(bit_...
设计包含最小函数min(),取出元素函数pop(),加入元素函数push()的栈MinStack,实现其中指定的方法(2)。 MinStack中数据存储使用Java原生的Stack,存储数据元素为int。请实现以下对应的方法,完善功能。 ...
本题目的两个设计问题分别是设计一个HashMap和一个MinStack。这两个数据结构在实际编程中有着广泛的应用,让我们详细探讨一下它们的设计与实现。 **问题1:设计HashMap** HashMap是一种基于哈希表实现的键值对存储...
leetcode 分类 Leetcode代码题解 随缘刷题,选择性更新题解 LeetCode 94 144 145 二叉树的前中后序遍历: Leetcode ...longest-consecutive-sequence ...Min Stack 最小栈: LeetCode 773 滑动谜题: ......
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -...
leetcode题库 JavaScript / TypeScript for LeetCode 谨以此仓库记录LeetCode刷题历程【2020.6.27 -> undefined】 使用JavaScript、TypeScript语言解决数据结构和算法问题 锻炼编程能力,培养算法思维,相互学习,...
if (minStack.isEmpty() || x <= minStack.peek()) { minStack.push(x); } } public void pop() { if (mainStack.pop().equals(minStack.peek())) { minStack.pop(); } } public int top() { return ...
* [Stack](https://github.com/kamyu104/LeetCode#stack) * [Queue](https://github.com/kamyu104/LeetCode#queue) * [Heap](https://github.com/kamyu104/LeetCode#heap) * [Tree]...
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 ...
minStack stack 111 二叉树的最小深度 , tree 110 平衡二叉树 tree 104 二叉树的最大深度 tree 100 相同的树 tree 94 二叉树的中序遍历 tree 70 爬楼梯 dp 53 最大子序和 dp 26 删除排序数组中的重复项 array 1 两数...
155.Min Stack 设置一个辅助栈专门用于放置当前最小的值,每次压栈时主栈压入新数据,辅助栈压入当前最小数据 316.Remove 重要 单调栈的问题,栈内元素大致递增,记录下串内字符的数量。有四题大致相同,总结一下...
Min Stack 数据结构为两个栈, 一个记录最小值的栈, 一个是存放正常压栈数据 入栈的时候判断新加入的数是否小于或等于最小值栈里的top 出栈时判断出栈数字和最小栈里的是否相等 Evaluate Reverse Polish Notation 逆...
(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分发糖果 Leetcode C++ Solution Don't try to understand ...155-最小栈:min-stack Tree 普通二叉树 94-二叉树中序遍历:inorder-traversal 100-相同的二叉树:same-tree 101-对称二叉树:symmetric-
在任何给定的时间点,minStack 将保持最小元素直到现在(推送或弹出值) 满足条件的线性搜索或二分搜索,因为解决方案始终存在 由于其他方法为大输入提供 TLE,因此筛选埃托色尼 按位解决方案,因为二的幂只包含 1 ...