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

本文详细解析LeetCode热题之最小栈问题,设计并实现了一个支持基本栈操作且能在常数时间内检索到最小元素的数据结构。通过三种不同方案对比,最终选择空间效率最优的方案进行代码实现。

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();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值