3 回答
TA贡献1848条经验 获得超6个赞
添加一个字段以保存最小值,并在Pop()和Push()期间对其进行更新。这样,getMinimum()将为O(1),但是Pop()和Push()将不得不做更多的工作。
如果弹出最小值,则Pop()将为O(n),否则它们仍将均为O(1)。调整大小时,根据Stack实现,Push()变为O(n)。
这是一个快速实施
public sealed class MinStack {
private int MinimumValue;
private readonly Stack<int> Stack = new Stack<int>();
public int GetMinimum() {
if (IsEmpty) {
throw new InvalidOperationException("Stack is empty");
}
return MinimumValue;
}
public int Pop() {
var value = Stack.Pop();
if (value == MinimumValue) {
MinimumValue = Stack.Min();
}
return value;
}
public void Push(int value) {
if (IsEmpty || value < MinimumValue) {
MinimumValue = value;
}
Stack.Push(value);
}
private bool IsEmpty { get { return Stack.Count() == 0; } }
}
添加回答
举报