算法训练 第七周

一、最小栈

在这里插入图片描述
本题要求我们实现一个最小栈数据结构,要求它可以实现栈的基本功能,并且还能使用常数时间复杂度来获取栈中的最小值。

1.辅助栈

我们可以在普通栈的基础上再添加一个维护最小值的辅助栈来实现这个数据结构,我们先创建一个普通的栈来完成栈的基本操作,再创建一个辅助栈,这个辅助栈中用来存放最小值,在我们往栈中存值的时候,如果存入的值比最小栈栈顶的元素还要小,那就把这个值在普通栈和辅助栈中都存入一个,如果存入的值比辅助栈栈顶的值大,那么我们在普通栈中存入这个值,再将辅助栈栈顶的元素再复制一份存入辅助栈,当我们需要弹出值时,就同时弹出普通栈和辅助栈的栈顶,这样辅助栈中就时刻维护着最小的元素了,具体代码如下:

class MinStack {
    public Stack<Integer> sta;
    public Stack<Integer> min;

    public MinStack() {
        sta = new Stack<>();
        min = new Stack<>();
    }
    
    public void push(int val) {
        if(sta.empty()) {
            sta.push(val);
            min.push(val);
        } else {
            if(val < min.peek()) {
                sta.push(val);
                min.push(val);
            } else {
                sta.push(val);
                min.push(min.peek());
            }
        }
    }
    
    public void pop() {
        sta.pop();
        min.pop();
    }
    
    public int top() {
        return sta.peek();
    }
    
    public int getMin() {
        return min.peek();
    }
}
/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */
复杂度分析
  • 时间复杂度:O(1)。
  • 空间复杂度:O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值