每日温度

描述

  • 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替

示例 1

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3

输入: temperatures = [30,60,90]
输出: [1,1,0]

提示

  • 1 <= temperatures.length <= 1 0 5 10^5 105
  • 30 <= temperatures[i] <= 100

Typescript 版算法实现


1 ) 方案1:暴力

function dailyTemperatures(temperatures: number[]): number[] {
    const length = temperatures.length;
    const ans: number[] = new Array(length).fill(0);
    const next: number[] = new Array(101).fill(Number.MAX_SAFE_INTEGER);

    for (let i = length - 1; i >= 0; --i) {
        let warmerIndex = Number.MAX_SAFE_INTEGER;

        // 查找比当前温度高的最小索引
        for (let t = temperatures[i] + 1; t <= 100; ++t) {
            if (next[t] < warmerIndex) {
                warmerIndex = next[t];
            }
        }

        // 如果找到了比当前温度高的温度,计算天数差
        if (warmerIndex < Number.MAX_SAFE_INTEGER) {
            ans[i] = warmerIndex - i;
        }

        // 更新当前温度的最新索引
        next[temperatures[i]] = i;
    }

    return ans;
}

2 )方案2:单调栈

function dailyTemperatures(temperatures: number[]): number[] {
    const length = temperatures.length;
    const ans: number[] = new Array(length).fill(0);
    const stack: number[] = []; // 使用数组模拟栈

    for (let i = 0; i < length; i++) {
        const temperature = temperatures[i];

        // 当栈不为空且当前温度大于栈顶索引对应的温度时
        while (stack.length > 0 && temperature > temperatures[stack[stack.length - 1]]) {
            const prevIndex = stack.pop()!;
            ans[prevIndex] = i - prevIndex;
        }

        // 将当前索引压入栈中
        stack.push(i);
    }
    return ans;
}

更多推荐