Skip to content

【剑指 Offer】 30. 包含min函数的栈 #2

@Earllam

Description

@Earllam

问题

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

定义两个栈,一个存储数据,另一个用于存储每次数据进栈时栈的最小值,每次数据进栈时,将当前数据与最小值栈栈顶元素比较,将两者中较小的值再次存入最小值栈中,当数据栈出栈的时候,最小值栈也出栈,这样最小值的栈顶永远是当前栈(数据栈)的最小值。

[[push],[push],[push],[push],[push],[push]]
[[4],[5],[3],[8],[7],[0]]

以上面面操作为例,则数据栈和其对应的最小值栈如下

数据栈 最小值栈
0 0
7 3
8 3
3 3
5 4
4 4

代码

class MinStack {
    constructor() {
        this.dataStack = []
        this.minValueStack = []
    }
    /** 
     * @param {number} x
     * @return {void}
     */
    push(x) {
        this.dataStack.push(x)
        // 这样minValueStack栈顶一直是最小
        const min = this.min()
        if (this.minValueStack.length === 0 || x < min) {
            this.minValueStack.push(x)
        } else {
            this.minValueStack.push(min)
        }
    }
    /**
     * @return {void}
     */
    pop() {
        this.minValueStack.pop()
        return this.dataStack.pop()
    }
    /**
     * @return {number}
     */
    top() {
        return this.dataStack[this.dataStack.length - 1]
    }
    /**
     * @return {number}
     */
    min() {
        const length = this.minValueStack && this.minValueStack.length
        return length && this.minValueStack[length - 1]
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(x)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.min()
 */

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions