设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解题思路: 借用一个辅助栈m_min,用于存获取stack中最小值。
算法流程:
push()方法: 每当push()新值进来时,如果 小于等于 m_min栈顶值,则一起push()到m_min,即更新了栈顶最小值;
pop()方法: 判断将pop()出去的元素值是否是m_min栈顶元素值(即最小值),如果是则将m_min栈顶元素一起pop(),这样可以保证m_min栈顶元素始终是stack中的最小值。
getMin()方法: 返回m_min栈顶即可。
m_min作用分析:
m_min等价于遍历stack所有元素,把升序的数字都删除掉,留下一个从栈底到栈顶降序的栈。
相当于给stack中的降序元素做了标记,每当pop()这些降序元素,m_min会将相应的栈顶元素pop()出去,保证其栈顶元素始终是stack中的最小元素。
复杂度分析:
时间复杂度 O(1)O(1)O(1) :压栈,出栈,获取最小值的时间复杂度都为 O(1)O(1)O(1) 。
空间复杂度 O(N)O(N)O(N) :包含 NNN 个元素辅助栈占用线性大小的额外空间。

#include<stack>
#include<queue>
#include<iostream>
using namespace std;
class MinStack
{
stack<int> m_data;
stack<int> m_min;
public:
MinStack()
{
}
void push(int x)
{
m_data.push(x);
if (m_min.empty() || m_min.top()>x)
{
m_min.push(x);
}
}
void pop()
{
if (m_data.top()==m_min.top())
{
m_min.pop();
}
m_data.pop();
}
int top()
{
return m_data.top();
}
int getMin()
{
return m_min.top();
}
};
int main()
{
MinStack ms;
ms.push(-2);
ms.push(0);
ms.push(-3);
cout << ms.getMin() << endl;
ms.pop();
cout << ms.top() << endl;
cout << ms.getMin() << endl;
system("pause");
return 0;
}
常数时间检索最小元素的栈设计
889

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



