问题描述
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
原问题链接:https://oj.leetcode.com/problems/min-stack/
问题分析
如果之前看过一些关于算法方面的教材的话,会发现这个问题其实并不复杂。我们想想,因为需要获取当前元素的最小值。在每次对栈进行操作的时候,这个最小值可能在栈中间的任何一个地方。要想保留这个最小值,必然需要一个可以记录在某个范围内最小值为多少的结构。
在加入一个新的元素进来时,我们还需要将新加入的元素和当前最小值做比较,如果新加入的值比当前最小值还要小,则最小值就需要进行修改。同样,当取出一个元素的时候,如果当前值是最小的元素,我们也需要做相应的调整。一种比较简单的保存最小值的结构就是再使用一个栈,这个最小值栈保存着到对应栈顶元素最小值。按照这些讨论,我们可以得到如下的代码:
class MinStack { private Stack<Integer> itemStack = new Stack<Integer>(); private Stack<Integer> minStack = new Stack<Integer>(); public void push(int x) { if(itemStack.isEmpty() || x < minStack.peek()) { itemStack.push(x); minStack.push(x); } else { itemStack.push(x); minStack.push(minStack.peek()); } } public void pop() { itemStack.pop(); minStack.pop(); } public int top() { return itemStack.peek(); } public int getMin() { return minStack.peek(); } }
这个实现属于比较懒的办法。就是用一个最小值栈,每个元素都和原来的栈一一对应起来,如果原来的栈要加入的元素是当前最小的,则在两个栈中加入这个元素,否则在原来栈中加入这个元素而在最小值栈中加入它自己栈顶的那个。这种做法稍微有点浪费空间了。不过整体的空间复杂度还是在O(N).
除了前面这个思路以外,还有一种思路,就是不再和原来栈里的元素一一对应的去存,就只是在最小值栈里保存最小的那个。它的实现和原来的差不多,只有两个方法的差别,push, pop方法的实现如下:
public void push(int x) { stack.push(x); if(minStack.isEmpty() || x <= minStack.peek()){ minStack.push(x); } } public void pop() { if(stack.peek().equals(minStack.peek())){ minStack.pop(); } stack.pop(); }
因为这个问题比较简单,就不再赘述了。
相关推荐
leetcode 分类 Leetcode代码题解 随缘刷题,选择性更新题解 LeetCode 94 144 145 二叉树的前中后序遍历: Leetcode ...longest-consecutive-sequence ...Min Stack 最小栈: LeetCode 773 滑动谜题: ......
如果`minStack`为空或x小于`minStack`的栈顶元素,那么`x`也应成为`minStack`的栈顶元素。 3. 执行`pop()`时,两个栈都弹出顶部元素。 4. `top()`操作只需返回`mainStack`的栈顶元素。 5. `getMin()`操作则直接返回`...
在任何给定的时间点,minStack 将保持最小元素直到现在(推送或弹出值) 满足条件的线性搜索或二分搜索,因为解决方案始终存在 由于其他方法为大输入提供 TLE,因此筛选埃托色尼 按位解决方案,因为二的幂只包含 1 ...
leetcode题库 JavaScript / TypeScript for LeetCode 谨以此仓库记录LeetCode刷题历程【2020.6.27 -> undefined】 使用JavaScript、TypeScript语言解决数据结构和算法问题 锻炼编程能力,培养算法思维,相互学习,...
155.Min Stack 设置一个辅助栈专门用于放置当前最小的值,每次压栈时主栈压入新数据,辅助栈压入当前最小数据 316.Remove 重要 单调栈的问题,栈内元素大致递增,记录下串内字符的数量。有四题大致相同,总结一下...
Min Stack 数据结构为两个栈, 一个记录最小值的栈, 一个是存放正常压栈数据 入栈的时候判断新加入的数是否小于或等于最小值栈里的top 出栈时判断出栈数字和最小栈里的是否相等 Evaluate Reverse Polish Notation 逆...
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -...
INT_MAX/INT_MIN. 3 总和 Size of vector >= 3 Three pointers, one move from 0 to n-1, other two are the same as in Two Sum Check duplicates 有效的副词 Stack is not empty, all paratheses are left ...
min-stack design-circular-deque trapping-rain-water 滑动窗口 通过窗口的大小不断调整来找到合适的值,或者窗口大小不变,通过左右移动来找到相应的结果 \ \ 其他 非 LeetCode 题,单纯在别人面试中看到的 \ 链表...
java入门 java_leetcode题解之155_Min_Stack
python python_leetcode题解之155_Min_Stack.py
javascript js_leetcode题解之155-min-stack.js
设计包含最小函数min(),取出元素函数pop(),加入元素函数push()的栈MinStack,实现其中指定的方法(2)。 MinStack中数据存储使用Java原生的Stack,存储数据元素为int。请实现以下对应的方法,完善功能。 ...
if (empty($this->minStack) || $x ($this->minStack)) { $this->minStack[] = $x; } } // 出栈操作 public function pop() { if (!empty($this->stack)) { if (end($this->stack) === end($this->minStack...
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]...
39. Min Stack:设计一个栈,支持 push、pop、top 操作,并且在常数时间内得到栈的最小值。 40. Evaluate Reverse Polish Notation:计算后缀表达式。 41. Valid Parentheses:验证括号的有效性。 【动态规划】 42....
包含min函数的栈(The_stack_containing_the_min_function.java) 队列的最大值(The_maximum_value_of_the_queue.java) 堆(heap_items) 最小的k个数(The_smallest_k_number.java) 位运算(bit_...
minStack stack 111 二叉树的最小深度 , tree 110 平衡二叉树 tree 104 二叉树的最大深度 tree 100 相同的树 tree 94 二叉树的中序遍历 tree 70 爬楼梯 dp 53 最大子序和 dp 26 删除排序数组中的重复项 array 1 两数...
leetcode分发糖果 Leetcode C++ Solution Don't try to understand ...155-最小栈:min-stack Tree 普通二叉树 94-二叉树中序遍历:inorder-traversal 100-相同的二叉树:same-tree 101-对称二叉树:symmetric-