题目描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
解题思路:辅助栈记录最小值,保存差值可以不使用辅助空间
解法一:辅助栈记录最小值
class MinStack {
Deque<Integer> valStack;
Deque<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
valStack = new LinkedList<>();
minStack = new LinkedList<>();
minStack.offerFirst(Integer.MAX_VALUE);
}
public void push(int val) {
valStack.offerFirst(val);
minStack.offerFirst(Math.min(val, minStack.peek()));
}
public void pop() {
valStack.pop();
minStack.pop();
}
public int top() {
return valStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
解法二:保存差值,且注意int越界问题,使用long
class MinStack {
Deque<Long> valStack;
long minVal;
/** initialize your data structure here. */
public MinStack() {
valStack = new LinkedList<>();
}
public void push(int val) {
if (valStack.isEmpty()) {
valStack.push(0L);
minVal = val;
return;
}
valStack.push(val - minVal);
if (val < minVal) {
minVal = val;
}
}
public void pop() {
if (valStack.peek() >= 0) {
valStack.pop();
} else {
minVal = minVal - valStack.pop();
}
}
public long top() {
if (valStack.peek() >= 0) {
return minVal + valStack.peek();
}else {
return minVal;
}
}
public long getMin() {
return minVal;
}
}