思路:我们如果直接用一个stack那么每次求最小值肯定得遍历一遍栈复杂度为O(n),我们可以用一个mstack和一个dstack来实现O(1)的复杂度,具体操作入栈时对于mstack来说,先判断mstack是否为空,若为空直接将元素插入mstack,若不为空,如果元素小于mstack栈顶元素入栈,否则不入,出栈时判断出栈元素是否等于mstack栈顶元素,若等于则出栈,否则不出。对于dstack来说就跟普通的入栈出栈操作一样。而要取得栈中的最小值,直接返回mstack栈顶元素就行了
参考代码:
class _stack
{
public:
int getm();
void push(int d);
void pop();
private:
stack<int> mstack;
stack<int> dstack;
};
int _stack::getm()
{
if(mstack.empty()) return -1;
return mstack.top();
}
void _stack::push(int d)
{
if(mstack.empty())
{
mstack.push(d);
}
else
{
if(d <= mstack.top())
{
mstack.push(d);
}
}
dstack.push(d);
}
博客介绍了一种实现栈内最小值O(1)复杂度的思路。若用单栈求最小值,复杂度为O(n),而使用mstack和dstack可实现O(1)复杂度。入栈和出栈时对mstack有特定操作,dstack则是普通操作,取最小值直接返回mstack栈顶元素。
3万+

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



