实现一个最小栈

本文介绍了一种特殊的数据结构——MinStack,它能够在常数时间内完成push、pop、top操作并检索到最小元素。通过使用两个栈A和B,A用于存储数据,B则始终保持其顶部为A的最小元素,实现高效查询。

题目网址:https://leetcode-cn.com/problems/min-stack/
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
常数时间的意思是时间复杂度是O(1);

思路是:
用空间换时间,用额外的空间把最小的元素提取保存好
我们创建两个栈,A和B
A用来表示栈中的数据
B专门用来存当前栈对应的最小值。
AB两个栈,第一次push时,A和B都push,此时第一次插入的值计为最小值,第二次插入值,A栈直接插入这个值,B栈顶与这个值比较进行打擂台,如果B栈顶的值比插入值大,栈顶插入插入值。如果B栈顶的值比插入值小,还是插入栈顶值
关键就是B的栈顶永远保存栈的最小值,擂台思想
出栈时记得两个栈都要出
在这里插入图片描述
B的栈顶永远是擂台的最小值


import java.util.Stack;

class MinStack {

    /** initialize your data structure here. */
    public MinStack() {

    }
    //A用来表示正常栈中的数据
    //B用来存储每一层A栈中对应的最小值
    private Stack<Integer> A = new Stack<>();
    private Stack<Integer> B = new Stack<>();
    
    public void push(int x) {
        //1.先把元素插入到A之中
        A.push(x);
        //最小值插入B
        if(B.isEmpty()){
            B.push(x);
            return;
        }
        //B如果不为空,B的栈顶元素就是之前的最小值,这时候需要与插的新元素进行对比
        int min = B.peek();
        if(x < min){
            min = x;
        }
        B.push(min);
    }

    public void pop() {
        if(A.isEmpty()) {
            return;
        }
        A.pop();
        B.pop();
    }

    public int top() {
        return A.peek();
    }

    public int getMin() {
        return B.peek();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值