持续创作,加速成长!这是我参与「掘金日新计划 · 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
};