时间复杂度:O(n)
解题思路
本题可用单调栈解决。
用单调栈存放下标,栈内按照从栈底到栈顶按照下标对应元素从大到小的顺序。当从左向右遍历数组时,比较该元素与栈顶下标对应温度,如果比栈顶大说明遇到了第一个比那天高的温度,所以就弹出栈顶,元素下标与栈顶下标的差就是天数,重复此过程直至栈为空,然后遍历的下标入栈。如果遇到空的栈也是让遍历的下标直接入栈。
具体实现时注意初始化结果res数组全为0,这样遍历完全部元素后,如果还有元素在栈中那它们的对应天数都是0,因为后面没有比它们高的温度了。
AC代码
func dailyTemperatures(temperatures []int) []int {
res:=make([]int,len(temperatures))
s:=[]int{}//单调栈
for i,t:=range temperatures{
res[i]=0//初始化
//只要栈内有元素就和栈顶比较
for len(s)>0&&t>temperatures[s[len(s)-1]]{
res[s[len(s)-1]]=i-s[len(s)-1]
s=s[:len(s)-1]//出栈
}
s=append(s,i)//入栈
}
return res
}
感悟
几天不做单调栈的题就忘了单调栈思路了,貌似所有像这种要比较谁大谁小的题都可以考虑单调栈,时间复杂度为O(n)效率很高!