引言
很长一段时间没有写博客,也没有刷 leetcode 了。这两天又刷了一下,发现还是生疏了不少。做 239. 滑动窗口最大值 的时候,发现有用单调队列的做法,突然想起了 剑指 Offer 59 - II. 队列的最大值 可不就是单调队列嘛。所以和最大(小)栈问题一起,做个总结记录以备查看。
最小栈问题
简单说明一下最小栈问题:设计一个栈结构,可以支持栈原有的push, pop,top 操作,同时加入 min 操作可以返回当前栈的最小值。
问题分析: 原本栈是一个单进单出的结构,先进后出。要求返回栈的最小值,那是需要每次都来个全体出栈,比较,再入栈的过程吗?答案当然是不,这样的做法复杂度太高了。那既然要保持原有栈的出栈入栈等功能,还要记录最小值。一个栈不行,那就两个!用两个栈结构,一个保存 push 操作放当前最小值,一个push按原本的操作。
上栗子:155. 最小栈
class MinStack {
public:
stack<int> normalStack; // 正常操作栈
stack<int> minStack; // 最小值操作栈
/** initialize your data structure here. */
MinStack() {
//
}
void push(int x) {
normalStack.push(x); // 常规插入
// 比较当前插入值和栈顶值,取小值进行 push
if(minStack.empty()) minStack.push(x);
else minStack.push(min(x, minStack.top()));
}
void pop() {
// pop 操作两个都不要做额外的操作