LeetCode155|剑指 Offer 30. 包含 min 函数的栈

简介: 调用 min、push 及 pop 的时间复杂度都是 O(1)因此实现一个能够得到栈的最小元素的 min 函数,我们就不能使用for等循环去查找,直接去排序大可不必,所以我们可以通过创建另一个栈,专门去存储每次比较的最小值。
调用 min、push 及 pop 的时间复杂度都是 O(1)

因此实现一个能够得到栈的最小元素的 min 函数,我们就不能使用for等循环去查找,直接去排序大可不必,所以我们可以通过创建另一个栈,专门去存储每次比较的最小值。

新建两个栈数据结构,stack<int> s;stack<int> sort;

实现push加入函数,s就正常加,而sort里加每次比较后的最小值,最小值依旧在栈顶。

void push(int x) {
        s.push(x);
        if(!sort.empty()){
            int num = sort.top()<x?sort.top():x;
            sort.push(num);
        }else{
            sort.push(x);
        }
    }

pop删除函数也有需要注意的地方

情况一:

sort和s栈顶元素都是最小值

我们一旦删除了s中的最小值,那么sort这个栈顶元素本身不存在了,为了做出同步,所以两个栈都需要删除。

情况二:

sort是最小值,s栈顶是非最小值,会不会有错误呢?

我们以,-2,0,-3,4压入为例,如果我们同步删除两个栈的栈顶,-3被删除了,4被删除了,貌似最小值被我们删除了,可是你别忘记我们所写的push,最小值不止存入了一次,压入4之前,sort栈顶元素是-3,压入4时,4大于-3,因此,又一个-3被压入,删的只是本次比较的-3,之前的-3还是在栈中,不要忘记sort压入的是每次比较后的最小值,不是只有一个。

top函数不用多说,直接返回s的栈顶,min函数的实现方式则是返回sort的栈顶,sort栈顶永远是最小值。

完整代码

class MinStack {
public:
    stack<int> s;
    stack<int> sort;
    /** initialize your data structure here. */
    MinStack() {
    }
    void push(int x) {
        s.push(x);
        if(!sort.empty()){
            int num = sort.top()<x?sort.top():x;
            sort.push(num);
        }else{
            sort.push(x);
        }
    }
    void pop() {
        s.pop();
        sort.pop();
    }
    int top() {
        return s.top();
    }
    int min() {
        return sort.top();
    }
};


目录
相关文章
LeetCode 热题100——单调栈
LeetCode 热题100——单调栈
19 0
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
4月前
【Leetcode 2487】从链表中移除节点 —— 单调栈
解题思路:维持一个单调递增栈,当栈为空时,记录当前节点为头节点;否则当前节点为栈顶节点的后继节点
|
4月前
【Leetcode 1944】队列中可以看到的人数 —— 单调栈
解题思路:维持一个单调递增栈来辅助计算每个人能够看到的人数。从右往左遍历数组,对于每个人,我们将其身高与栈顶元素的身高进行比较。如果当前人的身高比栈顶元素的身高高,则栈顶元素无法被当前人看到,将其出栈,并累计计数
|
15天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
16天前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
17 0
|
2月前
|
算法 安全 Java
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
22 0
|
4月前
|
容器
代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I
代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I
32 0
|
2月前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
2月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记

热门文章

最新文章