剑指Offer---包含min函数的栈

本文介绍了一种在栈中以O(1)时间复杂度查找最小值的方法,通过维护一个辅助栈来实时更新最小值。在Java中,创建了一个名为MinStack的类,包含数据栈和辅助栈,入栈时比较元素与当前最小值,出栈时同步操作两个栈,确保最小值的准确性。这种方法在数据结构设计上提供了高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下
在这里插入图片描述


题目解读

此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 O(1) 的时间复杂度查找栈中的最小值。

1.使用一个变量 min 记录每次栈中的最小值,每次有元素进栈都对 min 进行更新。
这个方法存在一个问题,没有考虑出栈时,怎么对 min 进行更新。
2.为了解决出栈对最小值的更新,可以设定一个辅助栈,栈顶表示当前数据栈中的最小值,每次有元素入栈,就将当前最小值入辅助栈。出栈时,辅助栈也要将栈顶元素出栈,这就解决了出栈时的最小值更新问题。

push:将数据入栈的同时,更新最小值。如果入栈元素大于辅助栈顶元素(也就是元素入栈前,数据栈中的最小值),则最小值依旧是数据栈原来的最小值,否则将元素入辅助栈。

pop:将数据栈和辅助栈的栈顶元素同时出栈,保持辅助栈的栈顶元素是数据栈中的最小值。


2.题目解法

这里我使用java汇编语言进行解答,代码中的注解详细梳理了我的解答过程

class MinStack {
    private Stack<Integer> dataStack; // 数据栈
    private Stack<Integer> minStack; // 辅助栈,记录每次有元素进栈后或者出栈后,元素的最小值
    /** initialize your data structure here. */
    public MinStack() {
        // 初始化辅助栈和数据栈
        dataStack = new Stack<>();
        minStack = new Stack<>();
    }
    public void push(int x) {
        // 如果记录当前数据栈中最小值的辅助栈为空,或者最小值小于 x,则将 x 设置为最小值,即进辅助栈
        if(minStack.isEmpty() || minStack.peek() > x){
            minStack.push(x);
        }else{// 如果数据栈中当前最小值 < x, 则继续将最小值设置为上次的最小值
            minStack.push(minStack.peek());
        }
        dataStack.push(x);// 数据栈,进栈
    }

    public void pop() {
        minStack.pop();// 辅助栈,栈出栈
        dataStack.pop();// 数据栈,出栈
    }

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

    public int min() {
        return minStack.peek();
    }
}

本题引入辅助栈的概念,使题目更好理解,更加方便找出栈中的最小值,就算是出栈的是最小值,也不会影响原本栈中的最小值,起到了实时更新的效果。

测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值