一开始想的是直接使用一个栈来保存所有的数据,但是会发现在寻找最小值时会有时间的不够
因此考虑使用两个栈来保存,一个就是栈,另一个就是保存最小值
class MinStack {
/** initialize your data structure here. */
Stack<Integer> s1;
Stack<Integer> s2;
public MinStack() {
s1 = new Stack<>();
s2 = new Stack<>();
}
public void push(int x) {
if(s2.isEmpty()){
s2.push(x);
}
else if(x <= s2.peek()){
s2.push(x);
}
s1.push(x);
}
public void pop() {
if(s1.peek().equals(s2.peek())){ **//这里一定要是比较的是值,因此使用的是equals,一定要注意**
s2.pop();
}
s1.pop();
}
public int top() {
return s1.peek();
}
public int getMin() {
return s2.peek();
}
}
/**
* 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.getMin();
*/
需要注意的是比较的时候是进行值的比较而不是地址的比较,== 相当于比较地址
排名高的代码,思路都差不多,其实都是在取出最小值的时候进行优化,使用两个栈进行
class MinStack {
private LinkedList<Integer> stack;
private LinkedList<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new LinkedList<>();
minStack = new LinkedList<>();
}
public void push(int x) {
stack.push(x);
if(minStack.isEmpty() || x <= minStack.peek().intValue())
{
minStack.push(x);
}
}
public void pop() {
if(stack.isEmpty() || minStack.isEmpty())return;
if(stack.peek().intValue() == minStack.peek().intValue())minStack.pop();
stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}
/**
* 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.getMin();
*/