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]
解题思路
answer 数组表示下一个更高的温度出现在几天后,一种朴素的想法是从当前开始往后遍历,找第一个大于该元素的值。那么,也可以这样想,从当前元素开始,往前找,找到比它小的就更新。
用栈来维护元素的下标,出栈的条件是当前温度 cur 大于栈中下标所对应的温度,那么 cur 就可以用来更新 answer数组。
入栈,依次入栈就可以。
// date 2023/12/21
func dailyTemperatures(temperatures []int) []int {
stack := make([]int, 0, 16)
n := len(temperatures)
ans := make([]int, n, n)
for i := 0; i < n; i++ {
v := temperatures[i]
for len(stack) > 0 && v > temperatures[stack[len(stack)-1]] {
preIdx := stack[len(stack)-1]
ans[preIdx] = i - preIdx
stack = stack[:len(stack)-1]
}
stack = append(stack, i)
// 没有出栈之前,一直入栈,那么则说明 v 一直小于栈顶元素
// 栈是单调递减的,对应的数组也是单调递减的
// 栈维护的是温度单调递减
// 只要出现一个v比栈顶大的,那么栈里面比 v 小的都可以更新掉
}
return ans
}
最后更新于