OJ - 最小栈
题目难度:简单
设计一个支持 push ,pop ,top 操作,并能在 常数时间 内检索到最小元素的栈。
实现 MinStack 类:
-
MinStack() 初始化堆栈对象。
-
void push(int val) 将元素val推入堆栈。
-
void pop() 删除堆栈顶部的元素。
-
int top() 获取堆栈顶部的元素。
-
int getMin() 获取堆栈中的最小元素。-- 时间复杂度要为 O(1)
解题思路
思路1:不可行
在类中定义一个成员变量 int _min 来记录当前堆栈中最小的元素。
当元素入栈时,不断进行比较,更新 _min 的值;此时问题来了,当元素出栈时,如果恰好最小的元素出栈了,那 _min 的值该如何更新呢,只能遍历一遍堆栈找到最小元素了。
如果 0 出栈了,_min 应该更新成 5,所以只能遍历一遍堆栈了
思路2:定义两个栈,一个栈 _st 正常存放数据,另一个栈 _minst 存放当前栈中的最小元素
如何用两个栈实现以下操作呢?
- 入栈操作:向 _st 中入元素,如果该元素 <= _minst 的栈顶元素,则也将该元素入栈到 _minst 中
- 出栈操作:出 _st 栈顶元素,如果该元素 == _minst 的栈顶元素,则也将该元素从 _minst 中出栈
- 获取堆栈中的最小元素操作:返回 _minst 的栈顶元素即可
入栈 5 8 9 0 7 -5 0 3:
当前栈中的最小元素:
代码如下:
class MinStack {
public:
MinStack() {
// 不需要写构造函数,因为在初始化列表阶段,自定义类型成员会自动调用它的默认构造函数
}
void push(int val) {
_st.push(val); // 入栈元素
// 最小栈为空或者元素val小于等于最小栈栈顶元素,则把元素也入栈到最小栈中
if (_minst.empty() || val <= _minst.top())
_minst.push(val);
}
void pop() {
// 出栈元素等于最小栈栈顶元素,则把元素也从最小栈中出栈
if (_st.top() == _minst.top())
_minst.pop();
_st.pop(); // 出栈元素
}
int top() {
return _st.top();
}
int getMin() {
return _minst.top();
}
private:
stack<int> _st; // 保存栈中的元素
stack<int> _minst; // 保存当前栈中的最小元素
};