题目链接: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