剑指 Offer(第2版)面试题 30:包含 min 函数的栈
剑指 Offer(第2版)面试题 30:包含 min 函数的栈
题目来源:41. 包含 min 函数的栈
题目要求能在常数时间内检索到最小元素,所以单独使用一个栈,将栈遍历一遍求最小元素的做法是不行的。
解法1:双栈
我们的解法是使用双栈。
一个栈作为数据栈,正常进行数字的储存。
另一个栈作为有序栈,栈底最大,栈顶最小,与数据栈的操作同步,维护栈顶元素为数据栈的最小元素。
有序栈的具体操作如下:
- 将第一个元素入栈。
- 新加入的元素如果大于栈顶元素,那么新加入的元素就不处理。
- 新加入的元素如果小于等于栈顶元素,那么就将新元素入栈。
- 出栈元素不等于栈顶元素,不操作。
- 出栈元素等于栈顶元素,那么就将栈顶元素出栈。
代码:
class MinStack {
private:
stack<int> stk, minStack;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
stk.push(x);
if(minStack.empty() || x<=minStack.top())
minStack.push(x);
}
void pop() {
int x = stk.top();
stk.pop();
if(x == minStack.top())
minStack.pop();
}
int top() {
return stk.top();
}
int getMin() {
return minStack.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
示例:
输入:
["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.
解法2:单栈
我们把数据栈和有序栈融合,只用一个栈完成相同的功能。
这个栈同时保存的是每个数字 x 进栈的时候的值与插入该值后的栈内最小值。即每次新元素 x 入栈的时候保存一个元组:(当前值 x,栈内最小值)。
代码:
class MinStack {
private:
stack<pair<int, int >> stk;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
if (stk.empty())
stk.push(pair<int, int>(x, x));
else
stk.push(pair<int, int>(x, min(x, stk.top().second)));
}
void pop() {
stk.pop();
}
int top() {
return stk.top().first;
}
int getMin() {
return stk.top().second;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/