请注意,内存没有限制。 我需要从1到1000插入int。
我可以在常量顺序时间内执行以下每项操作:
请建议我适当的数据结构。
答案 0 :(得分:3)
由于没有内存限制,我将使用2个向量 - 一个用于堆栈上的实际数据,另一个用于跟踪堆栈中每个状态的最大值。
为简单起见,我假设这个堆栈只保留+ ve int
我知道这没有任何错误检查。但我只是在这里提供数据结构的想法,而不是完整的解决方案。
class StackWithMax
{
public:
StackWithMax() : top(-1), currentMax(0) { }
void push(int x);
int pop();
int getMax() { return m[top]; }
private:
vector<int> v; // to store the actual elements
vector<int> m; // to store the max element at each state
int top;
int currentMax;
};
void StackWithMax::push(int x)
{
v[++top] = x;
m[top] = max(x, currentMax);
}
int StackWithMax::pop()
{
int x = v[top--];
currentMax = m[top];
return x;
}
答案 1 :(得分:-1)
使用普通堆栈结构和计数器的附加数组
int c[1..1000]
和变量int maxVal=0
。
在代码中添加堆栈操作后的操作:
On push(x) -> c[x]++ ; maxVal = max(x,maxVal)
On pop():x -> c[x]-- ; if (c[x] == 0) { j=x; while(c[--j] == 0); maxVal = j; }
maxVal应始终具有最大值。
也许我错了,这应该具有摊销的计算复杂度O(1)。 自从我分析算法以来已经很长时间了。