739. Daily Temperatures
原题
解答思路
这道题的思路比较简单,很容易看出来是个单调栈。但具体怎么构造和维护这个单调栈却需要多思考和注意细节。
一开始我对于本题的解答就复杂化了,另外用了type Record struct来存储气温、天数、下标等信息,还采取在栈内遍历的方式来更新天数,最后自然TLE了。
该题目中提到,要找的答案是:从这一天起需要多少天才会升高气温,其实问的就是从某个元素x开始到第一个大于x的元素之间的距离(下标之差),认识到这一点之后就很简单了。
我们维护一个单调栈来存储下标,因为通过下标我们能够轻松访问相应的气温数据和计算答案。遍历temperatures数组,对于新一天的气温temperatures[i],将其与栈顶元素preIdx对应的气温作比较,如果新的气温更高,就要弹栈(保证栈内下标对应的气温遵循单调递减的顺序),弹栈时,说明栈顶对应的天数遇到了首个高于它气温的一天,那么两者之间的下标差(这里下标天然的就是时间顺序)就表明了所需要等待的天数。
代码
func dailyTemperatures(temperatures []int) []int {
n := len(temperatures)
ans := make([]int, n)
stk := []int{} // 栈内存储下标
for i := 0; i < n; i++ {
for len(stk) > 0 && temperatures[stk[len(stk)-1]] < temperatures[i] {
// 弹栈并记录答案
preIdx := stk[len(stk)-1]
ans[preIdx] = i - preIdx
stk = stk[:len(stk)-1]
}
stk = append(stk, i)
}
return ans
}