Typescript-Algorithms
    Preparing search index...

    Variable daily_temperaturesConst

    daily_temperatures: (temperatures: number[]) => number[] = dailyTemperatures

    739.每日温度

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


    输入: temperatures = [73,74,75,71,69,72,76,73]

    输出: [1,1,4,2,1,1,0,0]


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

    输出: [1,1,1,0]


    输入: temperatures = [30,60,90]

    输出: [1,1,0]


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

    Type declaration

      • (temperatures: number[]): number[]
      • Parameters

        • temperatures: number[]

        Returns number[]

    要寻找右边第一个比当前温度更高的温度,维持一个递减的单调栈

    1. 当遍历到的元素大于栈顶元素时

      • 循环查看栈顶元素并结算
      • 完成后弹出栈顶元素
    2. 当遍历到的元素小于等于栈顶元素时

      • 将当前元素入栈
    3. 继续遍历

      • 直到遍历完所有温度后停止操作

    通过单调栈维护一个从栈底到栈顶单调递减的序列。

    function dailyTemperatures(temperatures: number[]): number[] {
    // 由于需要求相对间隔天数,我们在s中存放下标而不是存放具体元素。具体元素可以通过temperatures[i]得到
    const n = temperatures.length;
    const s: number[] = []; // 我们让栈从栈底到栈顶维持单调递增
    const ans: number[] = new Array(n).fill(0); // 按照题意创建n个位置,每个位置默认0,代表如果右边没有比当前位置更大的第一个数。

    // 从左往右,逐步查看每个数
    for (let i = 0; i < n; i++) {
    // 如果栈空,我们放入当前数
    if (s.length === 0) {
    s.push(i);
    }
    else {
    // 否则栈不为空,如果我们要放入当前数,那么为了维持单调递减,我们需要不断查看栈顶元素:
    // 栈顶元素如果总是比当前数小,那么就出栈
    // 最后我们放入当前数,这样一来栈维持单调递减。
    // 由于栈里总是保持着没找到右边第一个比自己大的数,那么当我们能够出栈就代表我们看到了比栈顶数更大的第一个数了。于是我们记录结果
    while (temperatures[s[s.length - 1]] < temperatures[i]) {
    const j = s.pop()!;
    ans[j] = i - j;
    }

    s.push(i);
    }
    }

    return ans;
    };