Leetcode 739 Daily Temperatures

单调栈

Posted by Sirin on October 10, 2025
739. Daily Temperatures

原题

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
}