题目描述
设计一个支持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.
样例
输入
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[1],[3],[-4],[],[],[],[]]
输出
[null, null, null, null, -4, null, 3, 1]
笨方法
(开数组存最小值) $O(n^2)$
class MinStack {
public:
/** initialize your data structure here. */
stack<int> stk;
vector<int> q;
MinStack() {
}
void push(int x) {
stk.push(x);
q.push_back(x);
sort(q.begin(),q.end());
}
void pop() {
auto t = stk.top();
stk.pop();
for(int i=0;i<q.size();i++)
{
if(q[i]==t) q[i]=0x3f3f3f3f;
}
sort(q.begin(),q.end());
}
int top() {
return stk.top();
}
int getMin() {
if(q[0]!=0x3f3f3f3f) return q[0];
}
};
y总方法
设置两个栈,一个存所有值,一个专门用来存储最小值,如果最小值要从主栈弹出,则要同时将最小值从两个栈弹出。
stack<int> stackValue;
stack<int> stackMin;
MinStack() {
}
void push(int x) {
stackValue.push(x);
if (stackMin.empty() || stackMin.top() >= x)
stackMin.push(x);
}
void pop() {
if (stackMin.top() == stackValue.top()) stackMin.pop();
stackValue.pop();
}
int top() {
return stackValue.top();
}
int getMin() {
return stackMin.top();
}