剑指Offer-包含min函数的栈

115 阅读1分钟

题目

设计一个支持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();
 */