题目
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。
- push(x)–将元素x插入栈中
- pop()–移除栈顶元素
- top()–得到栈顶元素
- getMin()–得到栈中最小元素
数据范围
操作命令总数 [0,100][0,100]。
样例
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.
解析
使用两个栈stk(正常)、stkMin(包含当前最小值的栈),stk正常加入元素,当stkMin为空或stkMin栈顶元素大于等于当前值时,stkMin加入当前值;stk正常推出元素,当推出的值和stkMin栈顶元素相同时,就将stkMin栈顶元素推出。
代码
C++
class MinStack {
public:
/** initialize your data structure here. */
stack<int> stk, f;
MinStack() {
}
void push(int x) {
stk.push(x);
if (f.empty() || f.top() >= x) f.push(x);
}
void pop() {
if (f.top() >= stk.top()) f.pop();
stk.pop();
}
int top() {
return stk.top();
}
int getMin() {
return f.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
GO
type MinStack struct {
stk []int
stkMin []int
}
/** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{}
}
func (this *MinStack) Push(x int) {
this.stk = append(this.stk, x)
if len(this.stkMin) == 0 || this.stkMin[len(this.stkMin) - 1] >= x {
this.stkMin = append(this.stkMin, x)
}
}
func (this *MinStack) Pop() {
if this.stkMin[len(this.stkMin) - 1] == this.stk[len(this.stk) - 1] {
this.stkMin = this.stkMin[:len(this.stkMin) - 1]
}
this.stk = this.stk[:len(this.stk) - 1]
}
func (this *MinStack) Top() int {
return this.stk[len(this.stk) - 1]
}
func (this *MinStack) GetMin() int {
return this.stkMin[len(this.stkMin) - 1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(x);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.GetMin();
*/