题目描述
给定一个整数数组 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
代码及注释
func dailyTemperatures(temperatures []int) []int {
// 初始化一个栈,用于存储温度数组的索引
stack := make([]int, 0)
// 初始化结果数组,长度与温度数组相同
res := make([]int, len(temperatures))
// 获取温度数组的长度
length := len(temperatures)
// 遍历温度数组
for i := 0; i < length; i++ {
// 当栈不为空且当前温度大于栈顶温度时,更新结果
for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack) - 1]] {
// 取出栈顶的索引
pre := stack[len(stack) - 1]
// 弹出栈顶元素
stack = stack[:len(stack) - 1]
// 更新结果数组中对应索引的值
res[pre] = i - pre
}
// 将当前索引入栈
stack = append(stack, i)
}
// 返回结果数组
return res
}
代码解释
-
初始化栈和结果数组
stack := make([]int, 0) res := make([]int, len(temperatures))
stack
:用于存储温度数组的索引。res
:用于存储每一天需要等待多少天温度才会升高。
-
遍历温度数组
for i := 0; i < length; i++ {
对于温度数组中的每一天,执行以下操作:
a. 更新结果
for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack) - 1]] { pre := stack[len(stack) - 1] stack = stack[:len(stack) - 1] res[pre] = i - pre }
当栈不为空且当前温度大于栈顶温度时,从栈中弹出索引,并更新结果数组中对应索引的值。
b. 入栈
stack = append(stack, i)
将当前索引入栈。
-
返回结果数组
return res
返回结果数组
res
,其中存储了对于每一天,需要等待多少天温度才会升高的信息。
总结
这个算法使用了单调栈的思想。通过维护一个递减的温度索引栈,我们可以在 O(n) 的时间内找出对于每一天,需要等待多少天温度才会升高。