题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路
这道题其实还是有点难的,因为一开始我想的是用一个数组来存储。但是每次求最小元素就要遍历整个数组,时间复杂度为O(n)。不符合题意。
因此考虑设置一个辅助栈来实现,辅助栈用于存放最小的元素。
思路如下:
push函数:
1.将x压入栈a中
2.如果栈b为空或者x小于等于栈b的栈顶元素,则将x压入栈b中;pop函数:
1.如果a的栈顶元素等于b的栈顶元素,则二者同时出栈,注意,这里需要用equals()方法来判断
2.否则,a的栈顶元素出栈;top函数: 返回栈a的栈顶元素
min函数: 返回栈b的栈顶元素
代码
class MinStack {
/** initialize your data structure here. */
LinkedList<Integer> a,b;
public MinStack() {
a=new LinkedList<>();
b=new LinkedList<>();
}
public void push(int x) {
a.addLast(x);
if(b.size()==0 || x<=b.getLast()){
b.addLast(x);
}
}
public void pop() {
if(a.getLast().equals(b.getLast())){
a.removeLast();
b.removeLast();
}else{
a.removeLast();
}
}
public int top() {
return a.getLast();
}
public int min() {
return b.getLast();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/