算法(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
    }
}
相关推荐
重生之我要进大厂15 分钟前
LeetCode 876
java·开发语言·数据结构·算法·leetcode
一介俗子26 分钟前
TypeScript 中 extends 关键字
typescript
KBDYD10101 小时前
C语言--结构体变量和数组的定义、初始化、赋值
c语言·开发语言·数据结构·算法
Crossoads1 小时前
【数据结构】排序算法---桶排序
c语言·开发语言·数据结构·算法·排序算法
自身就是太阳1 小时前
2024蓝桥杯省B好题分析
算法·职场和发展·蓝桥杯
mez_Blog2 小时前
个人小结(2.0)
前端·javascript·vue.js·学习·typescript
孙小二写代码2 小时前
[leetcode刷题]面试经典150题之1合并两个有序数组(简单)
算法·leetcode·面试
little redcap2 小时前
第十九次CCF计算机软件能力认证-1246(过64%的代码-个人题解)
算法
David猪大卫2 小时前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ2 小时前
数据结构(Day14)
linux·c语言·数据结构·算法