Leetcode C++《热题 Hot 100-9》155.最小栈

Leetcode C++《热题 Hot 100-9》155.最小栈

  1. 题目
    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

    push(x) – 将元素 x 推入栈中。
    pop() – 删除栈顶的元素。
    top() – 获取栈顶元素。
    getMin() – 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. 思路
  • 这个题目也比较简单,方案1:用两个栈,一个数据栈,一个辅助min栈(辅助min栈可以和数据栈同步更新,也可以min变化的时候再更新)剑指offer 21 包含min函数的栈-类似题目链接
  • 更神奇的方案2:使用一个栈,外部记录min值,如果min值有变化,那将其加入到数据栈中,这个方法简直吓人太棒了
  • 方案2-3参考:https://leetcode-cn.com/problems/min-stack/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/
  • 还有一些变种方案3:数据栈大小不变,外部维护一个min值,存储min值与原数据的差,差为负数表示min值有更新
  • 时间复杂度三种方案都是O(n),考虑空间复杂度,最节省空间的是方案3,所以来试下方案3
  1. 代码
class MinStack {
public:
    /** initialize your data structure here. */
    //注意int在做减法操作时候,可能会超出int范围,所以需要使用long数据类型
    long min;
    stack<long> nums;

    MinStack() {
    }
    
    void push(int x) {
        if (nums.size() == 0) {
           min = x;
           nums.push(x-min);
           return;
        }
        else if (x < min) {
            nums.push(x-min);
            min = x;
        } else {
            nums.push(x-min);
        }
        
    }
    
    void pop() {
        if (nums.top() < 0)
            min = min - nums.top();
        nums.pop();
    }
    
    int top() {
        if (nums.top() < 0)
            return min;
        else {
            return min+nums.top();
        }
    }
    
    int getMin() {
        return min;
    }
};

/**
 * 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->getMin();
 */

你可能感兴趣的:(刷题)