【算法训练】LeetCode#15 最小栈
一、描述
155. 最小栈
设计一个支持 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.
二、思路
想简单了,本来想着用一个int变量存min值就行了...不把中等难度当中等...
- 方法一:用两个stack,一个是正常存储数据的stack,一个是存储插入时的最小值的minStack,当stack.pop时,minStack与之同步即可。
- 方法二:法一借助了额外空间,如果不借助额外空间也能做,但是不太好理解。每次插入时计算插入元素与当前最小值的差,将差存入栈中,pop或top元素时利用minValue计算真实值。
三、解题
public static class MinStack {
Stack<Integer> stack;
Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
int curMin = minStack.isEmpty() ? val : minStack.peek();
minStack.push(Math.min(curMin, val));
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
public static class MinStackV2 {
Stack<Long> stack; // 存储元素与最小值的差
long minVal;
public MinStackV2() {
stack = new Stack<>();
}
public void push(long val) {
if (stack.isEmpty()){
// 如果栈空,则
stack.push((long) 0);
minVal = val;
} else {
long tmp = val - minVal;
stack.push(tmp);
minVal = tmp > 0 ? minVal : val;
}
}
public void pop() {
long tmp = stack.pop();
minVal = tmp > 0 ? minVal : minVal-tmp;
}
public long top() {
long tmp = stack.peek();
return tmp > 0 ? minVal+tmp : minVal;
}
public long getMin() {
return minVal;
}
}