LeetCode:面试题 03.02. 栈的最小值

题目链接:https://leetcode-cn.com/problems/min-stack-lcci/

解题思路:

1. 通过新建两个栈,一个是数据栈,另一个是临时栈用于存放栈的最小元素;

2. 这里入栈应该将x直接入stk栈;

3. 临时栈判断是否为空,若空则直接入栈,否则将临时栈的栈顶与当前入栈元素x对比,x小于栈顶元素,则入栈;x大与栈顶元素则将较小的栈顶元素入栈;

4. 弹出时,将两个栈都pop;

5. 返回栈的最小元素时,由于临时栈从栈底到栈顶,是按照降序排列,返回栈顶元素即为最小值。

另外一种方法:

主要区别是在入栈时,小于临时栈顶元素,则不入栈,这时两个栈的元素数量不一致。

在弹出元素时,通过判断数据栈的栈顶元素是否与临时栈相同,相同则弹出临时栈的栈顶元素,否则不变;

方案一和方案二其实都是用stackMin栈保存着stackData 每一步的最小值。共同点是
所有操作的时间复杂度都为0(1)、空间复杂度都为0(n)。

区别是:

方案一中stackMin压入时稍省空间,但是弹出操作稍费时间;

方案二中stackMin压入时稍费空间,但是弹出操作稍省时间。

 1 class MinStack {
 2 public:
 3     /** initialize your data structure here. */
 4     MinStack() 
 5     {}
 6     std::stack<int> stk; //局部变量return之后 变量失效;
 7     std::stack<int> tmp; 
 8     
 9     void push(int x) 
10     {
11         if (tmp.empty())
12         {
13             tmp.push(x);
14         }
15         else if (tmp.top() > x)
16         {
17             tmp.push(x);
18         }
19         else 
20         {
21             tmp.push(tmp.top());
22         }
23         stk.push(x);
24     }
25     
26     void pop() 
27     {
28         stk.pop();
29         tmp.pop();
30     }
31     
32     int top() 
33     {
34         int i=stk.top();
35         return i;
36     }
37     
38     int getMin() 
39     {
40         return tmp.top();
41     }
42 };
43 
44 /**
45  * Your MinStack object will be instantiated and called as such:
46  * MinStack* obj = new MinStack();
47  * obj->push(x);
48  * obj->pop();
49  * int param_3 = obj->top();
50  * int param_4 = obj->getMin();
51  */
原文地址:https://www.cnblogs.com/Tavi/p/12504731.html