刷题使我快乐,满脸开心.jpg

  • 来源:力扣(LeetCode)
  • 链接:https://leetcode.cn/problems/daily-temperatures/
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目

给定一个整数数组 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, len(temperatures))
	ans := make([]int, len(temperatures))
	
	for i := range temperatures {
		// 不为空则尝试比对
        for len(stack) > 0 {
			// 如果栈顶位置的下标对应温度低于当前温度,那就可以出栈并记录结果
            if temperatures[stack[len(stack)-1]] < temperatures[i] {
                ans[stack[len(stack)-1]] = i - stack[len(stack)-1]
                stack = stack[:len(stack)-1]
            } else {
                break
            }
        }
		// 当前温度的下标入栈
        stack = append(stack, i)
	}
	// ans中没有写入结果的也就是最终没有找到更高温度的
	// 跟初始化值0相同,所以不用特殊处理了
	return ans
}