LeetCode每日温度问题使用JavaScript解题|前端学算法

1,755 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

今天巩固巩固栈

这是LeetCode的第739题:每日温度

每日温度

给定一个整数数组 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]

解题思路

我们可以遍历温度,当遍历过的温度,维持的是一个单调递减的态势时,我们就对这些温度的索引下标执行入栈操作;只要出现了一个数字,它打破了这种单调递减的趋势,也就是说它比前一个温度值高,这时我们就对前后两个温度的索引下标求差,得出前一个温度距离第一次升温的目标差值。

具体步骤可以拆分如下:

  • 第一步:初始化一个栈,用来存放温度下表;再初始化一个数组res,用来存放天数,初始化长度为温度数组长度

  • 第二步:遍历温度数组;当栈不为空且当前温度大于栈顶温度时进入二层循环;循环内,取出栈顶保存的索引,用当前索引减去栈顶获取的索引,并存放到res

  • 第三步: 将当前索引存入到栈内

  • 第四步: 返回res

var dailyTemperatures = function(temperatures) {
    // 初始化一个栈  
    let stack = [] 
    //  初始化结果数组,注意数组定长,占位为0
    let res = (new Array(temperatures.length)).fill(0) 
    for(let i=0;i<temperatures.length;i++) {
      // 若栈不为0,且存在打破递减趋势的温度值               栈内存的是温度下标
      while(stack.length && temperatures[i] > temperatures[stack[stack.length-1]]) {
        // 将栈顶温度值对应的索引出栈
        let top = stack.pop()  
        // 计算 当前栈顶温度值与第一个高于它的温度值 的索引差值
        res[top] = i - top 
      }
      // 注意栈里存的不是温度值,而是索引值,这是为了后面方便计算
      stack.push(i)
    }
    // 返回结果数组
    return res 
};

image.png