重点:
(1)vector和函数实现:用*min_element寻找STL容器的最小值,所以用vector模拟栈;
(2)双栈法实现:两个栈stk和minstk,表明对应元素在栈顶时,当前栈内的最小元素值;
难度中等
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
,pop
,top
, andgetMin
最多被调用3 * 104
次
解析:
方法1:
首先,此处用栈和vector都可以实现这个最小栈,问题在于怎么能在常数时间找到最小值。
想起了上道题用过的一个函数*min_element和*max_element,可以求STL容器的最值。那么我们此处使用vector模拟栈,然后用该函数实现寻找最小栈。代码运行成功。
方法2:
可以用另一个栈存当前栈的最小值,原栈为stk,最小栈为minstk。minstk对应stk的每个元素都代表着当前元素在时,栈内对应元素的最小值。那么push时,只需要将minstk.top()与入栈元素val的最小值压入minstk中即可,出栈就二者都出。
class MinStack {
private:
vector<int> stk;
public:
MinStack() {
}
void push(int val) {
stk.push_back(val);
}
void pop() {
stk.pop_back();
}
int top() {
return stk[stk.size()-1];
}
int getMin() {
return *min_element(stk.begin(),stk.end());
}
};
class MinStack {
private:
stack<int> stk;
stack<int> minstk;
public:
MinStack() {
minstk.push(INT_MAX);
}
void push(int val) {
stk.push(val);
//同时更新最小栈
if(val>minstk.top())
minstk.push(minstk.top());
else
minstk.push(val);
}
void pop() {
stk.pop();
minstk.pop();
}
int top() {
return stk.top();
}
int getMin() {
return minstk.top();
}
};