Leetcode155. 最小栈(HOT100)

链接

代码:

cpp 复制代码
class MinStack {
private:
    stack<int> f,s;
public:
    MinStack(){}
    
    void push(int val) {
        s.push(val);
        if(f.empty()||val<=f.top()){
            f.push(val);
        }
    }
    
    void pop() {
        if(s.top()<=f.top())f.pop();
        s.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
        return f.top();
    }
};

题解:这个题意还是比较难懂,代码写起来很简单,我们定义类的私有变量s作为存储数据的栈,然后为了常数时间内返回栈中最小元素,所以我们还定义了一个栈 f。f[i] 即:与之对应的s栈中目前最小的元素,但是我们还做了一个优化:如果你push进s栈一个很大的元素,我们 f 栈没必要动弹,因为我们f 记录的是最小元素。怎么判断?你push进s栈的元素如果小于等于f 的栈顶,我才在f 栈加一个元素。否则我f 栈什么都不做。

pop的时候也一样,pop的元素如果大于我的栈顶元素,那f 栈就不必更新什么。反之,如果你pop的元素小于等于f 栈顶元素,那么说明我之前记录过,所以f 也要pop。

相关推荐
爱喝矿泉水的猛男1 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展
YuTaoShao1 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
YouQian7722 小时前
Traffic Lights set的使用
算法
go54631584653 小时前
基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
图像处理·人工智能·深度学习·神经网络·算法
aramae3 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
大锦终4 小时前
【算法】前缀和经典例题
算法·leetcode
想变成树袋熊4 小时前
【自用】NLP算法面经(6)
人工智能·算法·自然语言处理
cccc来财4 小时前
Java实现大根堆与小根堆详解
数据结构·算法·leetcode
Coovally AI模型快速验证5 小时前
数据集分享 | 智慧农业实战数据集精选
人工智能·算法·目标检测·机器学习·计算机视觉·目标跟踪·无人机
墨尘游子5 小时前
目标导向的强化学习:问题定义与 HER 算法详解—强化学习(19)
人工智能·python·算法