leecode-739. 每日温度

94 阅读2分钟

前言

记录一下算法的学习

题目描述

给定一个整数数组 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 <= 105
30 <= temperatures[i] <= 100

暴力解法

根据题意,可以得到,只要算出最近一天比当前天温度高相差的天数,此天数作为当前下标的值。可以使用暴力双层循环来解决问题

const dailyTemperatures = (temperatures) => {
    const len = temperatures.length;
    const arr = new Array(len).fill(0)
    for(let i = 0; i < len; i++ ){
        for(let j = i + 1; j < len; j++ ) {
            if(temperatures[j] > temperatures[i]) {
                arr[i] = j - i
                break;
            }
        }
    }
    return arr
}

单调栈

根据题意,每一项只需要求得下一个比它大的数。而只要计算任意数右边或者左边第一个比它的数时候,可以使用单调栈来解答

这里以temperatures[73,74,75,71,69,72,76,73]为例

  1. 取出第0项73 将下标存入栈中,此时栈内为 [0]
  2. 取出 第1项74 查看栈顶,此时74 > temperatures[0],说明升温,将栈顶项取出,计算两者差值作为栈顶下标0升温天数为 1 - 0 = 1,并且将 第1项下标放入栈顶,此时栈内为 [1]
  3. 取出第2项75,查看栈顶,此时75 > temperatures[1],说明升温,将栈顶项取出,计算两者差值作为栈顶下标1升温天数为2 - 1 = 1,并且将 第2项下标放入栈顶,此时栈内为 [2]
  4. 取出第3项71,查看栈顶,此时71 < temperatures[2],说明降温,将 第3项下标放入栈顶,此时栈内为 [2,3]
  5. 取出第4项69,查看栈顶,此时69 < temperatures[3],说明降温,将 第4项下标放入栈顶,此时栈内为 [2,3,4]
  6. 取出第5项72,查看栈顶,此时72 > temperatures[4],说明升温,将栈顶项取出,计算两者差值作为栈顶下标4的升温天数 5 - 4 = 1。此时栈顶为3,此时72 > temperatures[3],将栈顶项取出,计算两者差值作为栈顶下标3的升温天数 5 - 3 = 2。此时栈顶为2,此时72 < temperatures[2], 将 第5项下标放入栈顶,此时栈内为 [2,5]
  7. 取出第6项76,查看栈顶,此时76 > temperatures[5],说明升温,将栈顶项取出,计算两者差值作为栈顶下标5的升温天数 6 - 5 = 1。此时栈顶为2,此时76 > temperatures[2],将栈顶项取出,计算两者差值作为栈顶下标2的升温天数 6 - 2 = 4。此时栈顶为空 将 第6项下标放入栈顶,此时栈内为 [6]
  8. 取出第7项73,查看栈顶,此时73 < temperatures[6],说明降温, 将 第7项下标放入栈顶,此时栈内为 [6,7]
  9. 全部遍历完成后,站内剩余的下标不存在升温天数,为0。
  10. 最终得出结果[1,1,4,2,1,1,0,0]
const dailyTemperatures = (temperatures) => {
    const len = temperatures.length;
    const stack = [0]; // 用数组模拟栈,先入栈0
    const arr = new Array(len).fill(0);
    for(let i = 1; i< len; i++ ) {
        while(arr.length && temperatures[i] > temperatures[stack[stack.length - 1]]) {
            const top = stack.pop(); // 取出栈顶
            arr[top] = i - top; // 计算相差天数
        }
        stack.push(i) // 压栈
    }
    return arr;
}

最后

每天进步一点点