剑指 Offer 30. 包含min函数的栈
题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
数据限制:
各函数的调用总次数不超过 20000 次
思路:
我们用一个名为list的List来模拟栈中的数据,用一个名为minlist的List来模拟当前的最小值。
当有新的数据加入时,就将其压入list中,并和minlist的首数据比较,计算出当前的最小值,如果要弹出数据,则将list和minlist同步弹出即可。
时间复杂度:O(n)
空间复杂度:O(n)
代码:
class MinStack {
/** initialize your data structure here. */
List<Integer> list;
List<Integer> minlist;
public MinStack() {
list = new ArrayList<>();
minlist = new ArrayList<>();
}
public void push(int x) {
list.add(x);
if (minlist.size() == 0){
minlist.add(x);
}else{
minlist.add(Math.min(x, minlist.get(minlist.size() - 1)));
}
}
public void pop() {
list.remove(list.size() - 1);
minlist.remove(list.size());
}
public int top() {
return list.get(list.size() - 1);
}
public int min() {
return minlist.get(minlist.size() - 1);
}
}
/**
* 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();
*/