最小栈-leetcode
题目描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack()初始化堆栈对象。void push(int val)将元素val推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。int getMin()获取堆栈中的最小元素。
示例 1:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1pop、top和getMin操作总是在 非空栈 上调用push,pop,top, andgetMin最多被调用3 * 104次
解法一
思路:
采用两个列表,一个记录当前入栈元素,一个记录最小元素。
当操作主列表时,我们需要同步操作最小元素列表:
- 添加元素 (
add):- 将新元素添加到
dataDeque。 - 比较新元素与
minDeque栈顶的元素:- 如果
minDeque为空,或者新元素小于等于minDeque的栈顶元素,则将新元素也添加到minDeque的栈顶。 - 为什么要用小于等于?因为如果有多个相同的最小值,我们需要确保在这些最小值被移除后,仍然能正确地找到下一个最小值。
- 如果
- 将新元素添加到
- 删除最后一个元素 (
removeLast):- 从
dataDeque中移除最后一个元素。 - 如果移除的这个元素 等于
minDeque的栈顶元素,那么也从minDeque中移除栈顶元素。 - 如果移除的元素不等于
minDeque的栈顶元素,说明它不是当前的最小值,或者有其他更小的元素在minDeque中,所以minDeque不需要改变。
- 从
- 获取最小值 (
getMin):- 直接返回
minDeque的栈顶元素。如果minDeque为空,说明主列表也为空,没有最小值。
- 直接返回
注意:
不会出现5,2,3,删除2后出现最小值出错的情况,因为栈中元素删除有顺序,先入后出。
代码:
class MinStack {
private List<Integer> stack;
private List<Integer> minStack;
public MinStack() {
stack = new ArrayList<>();
minStack = new ArrayList<>();
}
public void push(int val) {
stack.add(val);
if(minStack.isEmpty()) minStack.add(val);
else if(val <= minStack.get(minStack.size() - 1)) minStack.add(val);
}
public void pop() {
if(stack.isEmpty()) return;
int val = stack.get(stack.size() - 1);
stack.remove(stack.size()-1);
if(minStack.get(minStack.size() - 1) == val) minStack.remove(minStack.size() - 1);
}
public int top() {
if(stack.isEmpty()) return -1;
return stack.get(stack.size()-1);
}
public int getMin() {
if(stack.isEmpty()) return -1;
return minStack.get(minStack.size() - 1);
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/

浙公网安备 33010602011771号