题目描述: 根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

    例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

    提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

    思路:暴力遍历法:直接两层遍历,第一层定位一个温度,第二层定位离这个温度最近的一次升温是哪天,然后求出两个温度对应索引的差值即可。

    栈结构可以帮我们避免重复操作
    避免重复操作的秘诀就是及时地将不必要的数据出栈,避免它对我们后续的遍历产生干扰。

    1. /**
    2. * @param {number[]} T
    3. * @return {number[]}
    4. */
    5. // 入参是温度数组
    6. const dailyTemperatures = function(T) {
    7. const len = T.length // 缓存数组的长度
    8. const stack = [] // 初始化一个栈
    9. const res = (new Array(len)).fill(0) // 初始化结果数组,注意数组定长,占位为0
    10. for(let i=0;i<len;i++) {
    11. // 若栈不为0,且存在打破递减趋势的温度值
    12. while(stack.length && T[i] > T[stack[stack.length-1]]) {
    13. // 将栈顶温度值对应的索引出栈
    14. const top = stack.pop()
    15. // 计算 当前栈顶温度值与第一个高于它的温度值 的索引差值
    16. res[top] = i - top
    17. }
    18. // 注意栈里存的不是温度值,而是索引值,这是为了后面方便计算
    19. stack.push(i)
    20. }
    21. // 返回结果数组
    22. return res
    23. };