题目描述
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。
push(x)–将元素x插入栈中
pop()–移除栈顶元素
top()–得到栈顶元素
getMin()–得到栈中最小元素
样例
MinStack minStack = new MinStack();
minStack.push(-1);
minStack.push(3);
minStack.push(-4);
minStack.getMin(); --> Returns -4.
minStack.pop();
minStack.top(); --> Returns 3.
minStack.getMin(); --> Returns -1.
算法1
栈的操作基本没有变化 ,关键在于如何获取当前序列中最小的数。
最开始考虑使用最小堆,但是最小堆的弹出的时间复杂度达不到题目要求
我们从减少最小堆的不必要的存储和弹出的操作入手。如果当前push 的数据比最小堆的顶端最小数目大的话那么就不必push进入堆,
因为该数字push进容器内,它在容器内的存活周期中他的下面始终有一个存活周期比它长比他小的数字,所以它的push和pop是没有必要的
于是就可以大量减少最小堆的操作。
C++ 代码
class MinStack {
public:
/** initialize your data structure here. */
stack<int>data;
priority_queue<int, vector<int>, greater<int>> minHeap;
MinStack() {
}
void push(int x) {
data.push(x);
if (minHeap.empty() || x <= minHeap.top() ) minHeap.push(x);
}
void pop() {
if (data.empty()) return;
int x = data.top(); data.pop();
if (x <= minHeap.top()) minHeap.pop();
}
int top() {
return data.top();
}
int min() {
if (!minHeap.empty())
return minHeap.top();
return -999999;
}
};