剑指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  */

 

posted @ 2020-07-04 09:47  __rookie  阅读(102)  评论(0编辑  收藏  举报