算法(TS):最小栈

最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

提示:

  • -231 <= val <= 231 - 1
  • pop、top 和 getMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104 次

解答一

用一个栈同时保持入栈的值和当前栈的最新值

ts 复制代码
class MinStack {
    private data: {val: number;min:number}[] = []
    constructor() {
        
    }

    push(val: number): void {
        
        if (this.data.length === 0) {
            this.data.push({
                val,min:val
            })
        } else {
            const top = this.data[this.data.length-1]
            this.data.push({
                val,
                min: Math.min(val,top.min)
            })
        }
        
    }

    pop(): void {
        this.data.pop()
    }

    top(): number {
        return this.data[this.data.length-1].val
    }

    getMin(): number {
        return this.data[this.data.length-1].min
    }
}

解答二

用一个链表,链表中的每个节点保存到当前位置最小的值。

ts 复制代码
interface ValNode {
    val: number;
    min: number;
    next: ValNode | null
}

class MinStack {
    private head: ValNode | null = null
    constructor() {
        
    }

    push(val: number): void {
        if (this.head) {
            const prevHead = this.head
            this.head = {
                val,
                min: Math.min(prevHead.min,val),
                next:prevHead
            }
        } else {
            this.head = {
                val,
                min:val,
                next: null
            }
        }
    }

    pop(): void {
        if(this.head) {
            this.head = this.head.next
        }
    }

    top(): number {
        return this.head.val
    }

    getMin(): number {
        return this.head.min
    }
}

解答三

用单独的变量 min 表示栈在目前位置的最小值,维护一个 diff 栈,其中保存入栈的值与 min 的差值。

ts 复制代码
class MinStack {
    private diff: number[] = []
    private min: number | undefined
    constructor() {
        
    }

    push(val: number): void {
        if(this.diff.length === 0) {
            this.min = val
            this.diff.push(0)
        } else {
            const diff = val - this.min
            this.diff.push(diff)
            // 入栈的值更小了
            if (diff < 0) {
                this.min = val
            } 
        }
    }

    pop(): void {
        const diff = this.diff.pop()
        if(diff < 0) {
            this.min = this.min - diff
        }
    }

    top(): number {
        const diff = this.diff[this.diff.length-1]
        if(diff < 0) {
            return this.min
        } else {
            return diff + this.min
        }
    }

    getMin(): number {
        return this.min
    }
}
相关推荐
dog25010 分钟前
BBR 的 buffer 动力学观感
人工智能·算法
冲帕Chompa3 小时前
图论part10 bellman_ford算法
数据结构·算法·图论
緈福的街口3 小时前
【leetcode】144. 二叉树的前序遍历
算法·leetcode
GG不是gg3 小时前
排序算法之基础排序:冒泡,选择,插入排序详解
数据结构·算法·青少年编程·排序算法
随意起个昵称3 小时前
【双指针】供暖器
算法
倒霉蛋小马3 小时前
最小二乘法拟合直线,用线性回归法、梯度下降法实现
算法·最小二乘法·直线
codists4 小时前
《算法导论(第4版)》阅读笔记:p82-p82
算法
埃菲尔铁塔_CV算法4 小时前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
float_com4 小时前
【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)
算法·动态规划
丶Darling.5 小时前
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
数据结构·c++·算法·二叉树