剑指Offer 30. 包含 min 函数的栈

114 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例

示例1:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

提示

  1. 各函数的调用总次数不超过 20000 次

难度:简单

此题为简单题,兄弟们可以重拳出击!

二、思路分析

众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。

题目解析

  1. 定义一个包含 min 函数的栈数据结构,拥有 min 函数的栈,不仅可以进行入栈、出栈、获取栈顶元素等操作,还可以使用 min 函数返回栈中元素的最小值。
  2. 根据栈结构先进后出的特点,单个栈的顺序要求无法满足获取当前栈中最小值的需求,因此考虑增加其他容器。
  3. 获取栈最小值的函数只是获取,不会对栈中元素进行任何操作,可以使用一个额外的栈来记录当前栈中最小值
    • 如果后续入栈元素比当前栈顶元素小,则同时入最小值栈
    • 如果入栈元素比当前栈顶元素大,此时最小值不变,不会进行入栈操作
    • 获取最小值时直接从最小值栈获取栈顶元素
    • 元素出栈时,如果栈顶元素与最小值栈顶元素相等,则最小值栈需要同步出栈该元素

三、AC 代码

  • 代码定义类结构说明
/**
 * 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.min();
  • 逻辑代码
class MinStack {
    /** initialize your data structure here. */
    Stack<Integer> stack, stackMin;
    public MinStack() {
        stack = new Stack<>();
        stackMin = new Stack<>();
    }
    
    public void push(int x) {
        //入栈,如果当前值小于等于最小栈栈顶元素,说明为最小值,入最小栈
        stack.push(x);
        if(stackMin.isEmpty() || x <= stackMin.peek()){
            stackMin.push(x);
        }
    }
    
    public void pop() {
        //出栈,如果栈顶元素等于最小栈栈顶元素,则同时出栈
        if(!stack.isEmpty()){
            int cur = stack.pop();
            if(cur == stackMin.peek()){
                stackMin.pop();
            }
        }
    }
    
    public int top() {
        //栈顶,即获取正常栈栈顶元素
        if(stack.isEmpty()) return -1;
        return stack.peek();
    }
    
    public int min() {
        //最小值,获取最小栈栈顶元素
        if(stackMin.isEmpty()) return -1;
        return stackMin.peek();
    }
}

image.png

四、总结

知识点

  • 栈初始化方法:new Stack();
  • 栈判空方法:stack.isEmpty();
  • 入栈/出栈方法:stack.push(e);stack.pop();
  • 获取栈顶元素(不出栈):stack.peek();

最后

阳春三月,算法刷起来!LeetCode 剑指 Offer

简单题,不需要考虑太多,开干就是了。