如何使用max函数实现stack<int>
,其中max函数的复杂度为O(1)并且它使用O(n)额外内存?
答案 0 :(得分:6)
这个想法是通过使用堆栈中的对来跟踪最大值。如果您在堆栈中插入内容,则相应地更新最大值。
class Stack {
private:
stack<pair<int,int>> s;
public:
bool empty() const {
return s.empty();
}
int max() const {
assert (empty() == false);
return s.top().second;
}
int pop() {
int ans = s.top().first;
s.pop();
return ans;
}
void push(int x) {
if (s.empty() || x > s.top().second)
{
s.emplace(x, x);
}
else
{
s.emplace(x, s.top().second);
}
}
};
答案 1 :(得分:2)
维护已排序list
int
每个堆栈节点都指向list
条目
max
只返回min
list
将是尾部)
当push
同时对list
进行排序插入时(请注意,现在这将是O(n)但不排除) < / p>
当您pop
删除list
获得头部是O(1)。 list
的大小为O(n)。
答案 2 :(得分:2)
您可以在结构中保留2个堆栈,其中一个用作普通堆栈。另一个用于最大值存储(让我们称之为max_stack
)。
如果推送的值大于或等于max_stack
顶部的值,您只想在max_stack
中推送一个值。如果从普通堆栈弹出的值等于max_stack
的顶部,您只想弹出max_stack
。因此top max_stack
始终保持当前堆栈中的最大值。
例如:
推入2,1,2,1,3,2,3,max_stack
看起来像2,2,3,3。