每日温度
给定一个整数数组 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 };