设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是用一个辅助容器存储当前栈的最小值,如果用其他容器,在多次pop和push后,对于最小值的维护很难实现,如果辅助容器和主容器都用一种的话维护起来就会简便许多.目的是主容器在pop和push后,辅助的容器依然能够有效的获取最小值,考虑用辅助栈(在栈顶维护一个最小值):第一次push的时候,主栈和辅助栈都add,之后再push的时候,如果push(x)的值小于辅助栈的顶部元素,辅助站add(x),否则辅助栈就add当前顶部的元素(目的是既要辅助栈内的元素数量和主栈元素数量相等(同步,便于理解,也可以优化出入口条件节俭空间),也要保持辅助栈顶部元素是最小值); pop的时候辅助栈和主栈都pop(理由同上,同步便于理解).
总结:解决问题前先想想各个容器的特点,结合容器的特点和题目的特点,有效的将两者结合在一起
import java.util.Stack;
public class MinStack {
// 数据栈
private Stack<Integer> data;
// 辅助栈
private Stack<Integer> helper;
/**
* initialize your data structure here.
*/
public MinStack() {
data = new Stack<>();
helper = new Stack<>();
}
// 思路 1:数据栈和辅助栈在任何时候都同步
public void push(int x) {
// 数据栈和辅助栈一定会增加元素
data.add(x);
if (helper.isEmpty() || helper.peek() >= x) {
helper.add(x);
} else {
helper.add(helper.peek());
}
}
public void pop() {
// 两个栈都得 pop
if (!data.isEmpty()) {
helper.pop();
data.pop();
}
}
public int top() {
if(!data.isEmpty()){
return data.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
public int getMin() {
if(!helper.isEmpty()){
return helper.peek();
}
throw new RuntimeException("栈中元素为空,此操作非法");
}
}
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/min-stack/solution/shi-yong-fu-zhu-zhan-tong-bu-he-bu-tong-bu-python-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。