面试题30. 包含min函数的栈|刷题打卡

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

一、题目描述:


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


二、思路分析:


实现一个栈包含栈的push、pop、min、top。从此可以看出需要创建一个MinStack类,类中包含以上四个方法。

可以使用两个栈实现min函数栈。一个存放正常的元素栈(element),一个存放最小元素的栈(smallest)。 最小元素栈从大到小排列。

咱们先挑简单的实现。


top:

返回元素栈顶即可。(this.element[this.element.length - 1])


min:

min方法返回的是当前元素栈中最小的值。直接返回最小栈中的栈顶即可。(this.smallest[this.smallest.length - 1])


push:

对于入栈,可以使用一个元素栈存放正常的元素顺序。


方法一:

在最小栈中,

  • 最小栈为空。直接将当前元素push到最小栈中;
  • 不为空,判断存放的当前值与当前最小栈的栈顶元素:小于等于,执行压栈操作。


例:

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

网络异常,图片无法展示
|


方法二:最小栈的长度和元素栈一样。

  • 最小栈为空。直接将当前元素push到最小栈中;
  • 最小栈不为空。 当前元素小于等于最小栈栈顶元素,将当前元素压入最小栈;大于,将当前最小栈栈顶元素再一次入栈。


例:

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

网络异常,图片无法展示
|


pop:

方法一:

采用push方法一后,在考虑出栈的时候,需要判断当前最小栈栈顶是否等于当前元素的栈顶元素。 如果相等,在元素栈出栈时,最小栈也需要执行相应出栈操作。例:

minStack.pop();

minStack.pop();

网络异常,图片无法展示
|

方法二:沿用push方法二:元素出栈时,因为最小栈和元素栈长度相同,所以最小栈也执行相应出栈操作即可。


例:

minStack.pop();

minStack.pop();

网络异常,图片无法展示
|


三、AC 代码:


// 法一
class MinStack {
    element: number[];
    smallest: number[];
    constructor() {
        this.element = [];
        this.smallest = [];
    }
    push(x: number): void {
        this.element.push(x);
        if (!this.smallest.length) {
            this.smallest.push(x);
        } else {
            if (this.smallest[this.smallest.length - 1] >= x) {
                this.smallest.push(x);
            }
        }
    }
    pop(): void {
        this.smallest[this.smallest.length - 1] === this.element.pop() && this.smallest.pop();
    }
    top(): number {
        return this.element[this.element.length - 1];
    }
    min(): number {
        return this.smallest[this.smallest.length - 1];
    }
}
// 法二
push(num: number) {
    this.element.push(num);
    if (!this.smallest.length) {
      this.smallest.push(num);
    } else if (this.smallest[this.smallest.length - 1] >= num) {
      this.smallest.push(num);
    } else {
      this.smallest.push(this.smallest[this.smallest.length - 1]);
    }
  }
pop() {
    this.element.pop();
    this.smallest.pop();
  }


四、总结:


考察对栈的基本实现功能。此题属于简单题,对于栈的原理理解,基本可以做出来。


作者:ClyingDeng

链接:https://juejin.cn/post/6948977107766607879

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

目录
相关文章
|
19天前
|
SQL Oracle 关系型数据库
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
本文介绍了多种SQL内置函数,包括单行函数、非空判断函数、日期函数和正则表达式相关函数。每种函数都有详细的参数说明和使用示例,帮助读者更好地理解和应用这些函数。文章强调了字符串操作、数值处理、日期计算和正则表达式的使用方法,并提供了丰富的示例代码。作者建议读者通过自测来巩固学习成果。
15 1
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
|
8天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
25 2
|
1月前
|
存储
经典面试题:写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个 复制 #define MIN(a,b) ((a)<=(b)?(a):(b))
你的宏定义已非常接近标准。以下是改进后的 `MIN` 宏定义,支持多种数据类型并避免副作用:
|
3月前
|
机器学习/深度学习
【机器学习】如何判断函数凸或非凸?(面试回答)
文章介绍了如何判断函数是凸函数还是非凸函数,包括凸函数的定义、几何意义、判定方法(一元函数通过二阶导数判断,多元函数通过Hessian矩阵的正定性判断),以及凸优化的概念和一些经典的凸优化问题。
173 1
【机器学习】如何判断函数凸或非凸?(面试回答)
|
3月前
|
JavaScript
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
这篇文章解释了为什么在Vue中组件的`data`属性必须是一个函数而不是一个对象。原因在于组件可能会有多个实例,如果`data`是一个对象,那么这些实例将会共享同一个`data`对象,导致数据污染。而当`data`是一个函数时,每次创建组件实例都会返回一个新的`data`对象,从而确保了数据的隔离。文章通过示例和源码分析,展示了Vue初始化`data`的过程和组件选项合并的原理,最终得出结论:根实例的`data`可以是对象或函数,而组件实例的`data`必须为函数。
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
|
3月前
|
存储 设计模式 Java
Unity精华☀️ 面试“堆、栈”误区!这样做可能反而会降低吸引力
Unity精华☀️ 面试“堆、栈”误区!这样做可能反而会降低吸引力
|
3月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
3月前
|
安全 Java
虚拟机栈的五道面试题
这篇文章提供了关于Java虚拟机栈的五个面试问题,涉及栈溢出的情况、栈大小调整、栈内存的分配、垃圾回收与虚拟机栈的关系以及局部变量的线程安全性。
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
下一篇
无影云桌面