学习笔记:剑指 Offer 30. 包含min函数的栈

96 阅读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.

题目解析

定义栈的数据结构,首先想到栈的特点(FILO),同时题干中描述的min、push、pop方法的时间复杂度都是O(1),第一时间想到的肯定是使用对象来存储,通过key进行查找,将时间复杂度降为O(1),这个是最简单的方式。

代码实现

const Stack = function() {
    // 定义对象, 用来存储数据
    this.items = {}
    // 定义计数器,用来计算数据长度或大小
    this.count = 0
    // 用来保存最小值
    this.minItem = null
}
Stack.prototype.push = function(val) {
    // 判断最小值是否为空
    if (this.minItem === null) {
        this.minItem = val
    } else {
        // 取最小值
        this.minItem = Math.min(this.minItem, val)
    }
    this.items[this.count] = val
    // 计数器自增
    this.count++
}
Stack.prototype.pop = function() {
    // 出栈操作,result保存栈顶元素(即将出栈的元素)
    const result = this.items[this.count - 1]
    delete this.items[this.count - 1]
    this.count--
    // 出栈元素为最小值,则重新计算最小值
    if (result === this.minItem) {
        this.minItem = Math.min(...Object.values(this.items))
    }
}
Stack.prototype.min = function() {
    return this.minItem
}
Stack.prototype.top = function() {
    return this.items[this.count - 1]
}

const stack = new Stack()
stack.push(-2)
stack.push(0)
stack.push(-3)
console.log(stack.min())
stack.pop()
console.log(stack.top())
console.log(stack.min())

题目来源

力扣(LeetCode) 链接:leetcode-cn.com/problems/ba…

思路来源

学习JavaScript数据结构与算法(第3版) 第四章 栈