剑指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(); } };
觉得吧知道了思路代码就很容易写了,但是共感觉不够健壮,比如空栈pop怎么办?但是好像…STL中stack也没管这个问题
然后是力扣那边的提交结果
感觉时间效率不是很高,是不是有优化的空间
尝试了把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 中国大陆许可协议进行许可。
分类:
,
标签:
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步