最小栈

常数时间检索最小元素的栈设计

设计一个支持 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 个元素辅助栈占用线性大小的额外空间。

155.gif

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值