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

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


题目解读

此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 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();
    }
}

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

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

Supongo que te gusta

Origin blog.csdn.net/qq_54088719/article/details/121591317
Recomendado
Clasificación