包含min函数的栈

包含min函数的栈

http://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49

描述

这是一篇针对初学者的题解。
知识点:栈
难度:一星


题解

题目抽象:要求实现一个O(1)时间复杂度的返回最小值的栈。正常情况下,栈的push,pop操作都为O(1),
但是返回最小值,需要遍历整个栈,时间复杂度为O(n),所以这里需要空间换时间的思想。

方法:使用辅助栈

首先需要一个正常栈normal,用于栈的正常操作,然后需要一个辅助栈minval,专门用于获取最小值,具体操作如下。

  • push操作就如图片上操作。
  • pop操作直接对应弹出就好了。
  • top操作就返回normal的栈顶
  • min操作就返回minval的栈顶

因此,代码如下:

class Solution {
public:
    stack<int> normal, minval;
    void push(int value) {
        normal.push(value);
        if (minval.empty()) {
            minval.push(value);
        }
        else {
            if (value <= minval.top()) {
                minval.push(value);
            }
            else {
                minval.push(minval.top());
            }
        }
    }
    void pop() {
        normal.pop();
        minval.pop();
    }
    int top() {
        return normal.top();
    }
    int min() {
        return minval.top();
    }
};

时间复杂度:O(1)
空间复杂度:O(n), 开辟了一个辅助栈。

全部评论
这个很巧妙, 两个栈的长度要实时的对齐, 保证pop操作不会影响最小值
7
送花
回复 分享
发布于 2021-04-26 21:43
妙啊妙啊
1
送花
回复 分享
发布于 2021-05-28 11:55
国泰君安
校招火热招聘中
官网直投
我靠,恍然大明白的感觉
1
送花
回复 分享
发布于 2021-06-02 00:55
题解的代码 太冗余了吧class Solution { public: stack<int> sta_1,sta_2; void push(int value) { sta_1.push(value); if(sta_2.empty() || value <= sta_2.top()) sta_2.push(value); } void pop() { if(sta_1.top() == sta_2.top() ) sta_2.pop(); sta_1.pop(); } int top() { return sta_1.top(); } int min() { return sta_2.top(); } };</int>
1
送花
回复 分享
发布于 2021-07-11 08:39
弱弱的问一句可以用一个min下标来表示min的位置吗,然后每次压栈的时候进行判断一下
点赞
送花
回复 分享
发布于 2021-05-13 17:44
直接用vector不就行了
点赞
送花
回复 分享
发布于 2022-02-14 22:06
妙啊
点赞
送花
回复 分享
发布于 2022-03-14 22:56
没必要stack2非要size和stack1对齐,有选择的push()和pop()就可以
点赞
送花
回复 分享
发布于 2022-03-15 20:10
问个问题,我在top和min里加了判断栈不空的条件后,居然错误。。。不知道这个是什么原因,也看不到如何调用,所以无法debug
点赞
送花
回复 分享
发布于 2022-04-10 18:07

相关推荐

105 6 评论
分享
牛客网
牛客企业服务