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

167 阅读2分钟

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

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.

提示

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

2、思路

拿到题目我们会会有第一思路,利用栈去解决问题,但是在第一次的提交会发现一些问题,我们该如何去记录弹出的时候,也让该最小元素也弹出,所以 我们需要解决这个问题。

首先思路是利用两个栈来解决该问题

  • 数栈:用于存储所有元素,保证入栈push() 函数、出栈pop() 函数、获取栈顶top()函数
  • 最小数栈:存储栈数栈中所有降序的元素,则数栈中的最小的元素始终对应最小栈的栈顶元素,即min()函数只需返回最小栈的栈顶元素。

所以,设法维护好最小栈的元素,使其保持非严格降序,即可实现min() 函数的0(1)复杂度。

数组同栈的思路相同,只不过是换了一种存储的方法。

废话少说 ~~~~~ 上代码!

3、代码

使用栈

import java.util.Stack;
class MinStack {    
    Stack<Integer> numsStack, minStack;
    public MinStack() {
        numsStack = new Stack<>();
        minStack = new Stack<>();
    }
    public void push(int x) {
        numsStack.add(x);
        if(minStack.empty() || minStack.peek() >= x)
            minStack.add(x);
    }
    public void pop() {
        if(numsStack.pop().equals(minStack.peek()))
            minStack.pop();
    }
    public int top() {
        return numsStack.peek();
    }
    public int min() {
        return minStack.peek();
    }
    
}

使用数组来模拟栈

import java.util.Stack;
class MinStack {
    Stack<Integer> stack;
    int mins[] = new int [20005];
    int index = 0;
    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<>();
    }
    
    public void push(int x) {
        stack.push(x);
        if(index==0){
            mins[++index] = x;
        }else{
            mins[++index] = Math.min(mins[index-1], x);
        }
    }
    
    public void pop() {
        stack.pop();
        mins[index--] = 0;
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return mins[index];
    }
}
​
/**
 * 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();
 */

4、总结

该题目的最大难度在于如何将 min() 函数复杂度降为 O(1) ,我们可以建立辅助空间,来实现次功能。可以用栈、也可以用数组来实现。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:剑指 Offer 30. 包含min函数的栈