2022-04-18 23:45阅读: 23评论: 0推荐: 0

剑指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();
}
};

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16150404.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起