剑指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 次
不能直接用一个int型保存最小值,因为当最小值被弹出后,我们就不能在O(1)内获取新的最小值了。
使用2个栈,一个记录数据,一个每次都压入当前栈的最小值,等于说记录了栈压入了这些数据时的最小值。
1 class MinStack { 2 public: 3 stack<int> data; 4 stack<int> mins; 5 /** initialize your data structure here. */ 6 MinStack() { 7 cout<<"MinStack is created."<<endl; 8 } 9 10 void push(int x) { 11 data.push(x); 12 if(mins.empty() || x<mins.top()) 13 mins.push(x); 14 else 15 mins.push(mins.top()); 16 return ; 17 } 18 19 void pop() { 20 data.pop(); 21 mins.pop(); 22 return ; 23 } 24 25 int top() { 26 return data.top(); 27 } 28 29 int min() { 30 return mins.top(); 31 } 32 }; 33 34 /** 35 * Your MinStack object will be instantiated and called as such: 36 * MinStack* obj = new MinStack(); 37 * obj->push(x); 38 * obj->pop(); 39 * int param_3 = obj->top(); 40 * int param_4 = obj->min(); 41 */