剑指Offer-30-包含min函数的栈/力扣-155-最小栈

好吧,看到题目的第一反应是:定义一个成员变量用来保存最小值,每次压栈都通过比较刷新这个变量。

那么问题来了:如果最小值被弹出去了怎么办?那么此时单独一个变量可能已经不能满足需求了

说是拿一个辅助栈来存每一步的最小值,不管是插入弹出始终保持同步

嗯,这个“最小栈”拿什么来实现?我还想着会不会是数组什么的,看题解就是拿栈
拿栈做底层实现的话,感觉都不需要自己实现压栈、弹栈的操作了

那么写一下思路

// 每次数据栈中压入一个元素,就往辅助栈中压入当前的最小元素
// 数据栈中发生弹出操作时,辅助栈也同步操作

需要注意的是:当栈为空时stack.top()会报错stack.pop()同样也会报错

代码

class MinStack {
public:

    stack<int> data;
    stack<int> min;
    MinStack() {
    }

    void push(int val) {
        data.push(val);
        // 需要考虑空栈时top和pop的情况
        // 如果栈空那么应该是无条件压入的
        if (min.size()==0||val < min.top()) {
            min.push(val);
        }
        else {
            min.push(min.top());
        }
    }

    void pop() {
        /*if (data.size() == 0 || min.size() == 0) {
            return;
        }*/
        data.pop();
        min.pop();
    }

    int top() {
        return data.top();
    }

    int getMin() {
        return min.top();
    }
};

image

觉得吧知道了思路代码就很容易写了,但是共感觉不够健壮,比如空栈pop怎么办?但是好像…STL中stack也没管这个问题

然后是力扣那边的提交结果
image

感觉时间效率不是很高,是不是有优化的空间
image
尝试了把pop判断删了,然后size()==0换成empty()
好像没法再优化了吧

PS:去查了一下,虽说不保证empty()效率更高,但还是更推荐使用这种方法来判空


2023/1/29

我一下子还奇怪为什么能直接用栈,既然能直接用栈了为什么还要用两个栈?用一个int存一下最小值不就可以了吗

如果真的这样做了,问题在于:不仅有push(),每一次的pop()也会影响到栈中的最小值

class MinStack {
private:
	stack<int> stk,min_stk;
public:
    MinStack() {
    }

    void push(int x) {
		stk.push(x);
		if (min_stk.empty()) min_stk.push(x);
		// 每次插入当前的最小值,并于主栈保持同步pop
		else min_stk.push(std::min(min_stk.top(), x));
    }

    void pop() {
		stk.pop();
		min_stk.pop();
    }

    int top() {
		return stk.top();
    }

    int min() {
		return min_stk.top();
    }
};
posted @ 2022-04-18 23:45  YaosGHC  阅读(29)  评论(0)    收藏  举报