Every day a Leetcode
题目来源:155. 最小栈
解法1:双栈
题目要求能在常数时间内检索到最小元素,所以单独使用一个栈,将栈遍历一遍求最小元素的做法是不行的。
我们的解法是使用双栈。
一个栈作为数据栈,正常进行数字的储存。
另一个栈作为有序栈,栈底最大,栈顶最小,与数据栈的操作同步,维护栈顶元素为数据栈的最小元素。
有序栈的具体操作如下:
- 将第一个元素入栈。
- 新加入的元素如果大于栈顶元素,那么新加入的元素就不处理。
- 新加入的元素如果小于等于栈顶元素,那么就将新元素入栈。
- 出栈元素不等于栈顶元素,不操作。
- 出栈元素等于栈顶元素,那么就将栈顶元素出栈。
代码:
class MinStack {
private:
stack<int> dataStack;//数据栈
stack<int> sortedStack;//有序栈,栈底最大,栈顶最小
public:
MinStack() {
}
void push(int val) {
dataStack.push(val);
if(sortedStack.empty() || val<=sortedStack.top())
{
sortedStack.push(val);
}
}
void pop() {
if(dataStack.top() == sortedStack.top())
{
sortedStack.pop();
}
dataStack.pop();
}
int top() {
return dataStack.top();
}
int getMin() {
return sortedStack.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* 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>> s;
public:
MinStack() {
}
void push(int val) {
if(s.empty()) s.push({val,val});
else s.push({val,min(val,s.top().second)});
}
void pop() {
s.pop();
}
int top() {
return s.top().first;
}
int getMin() {
return s.top().second;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
结果:

本文详细介绍了如何使用双栈和单栈两种方法解决LeetCode第155题——最小栈。在双栈方案中,一个栈用于数据存储,另一个栈保持有序并维护最小值。而在单栈方案中,栈内存储元组(当前值,栈内最小值)。两种方法均能在常数时间内获取最小值,实现了高效的数据操作。
346

被折叠的 条评论
为什么被折叠?



