1、解法1
看完题目后感觉最直观的暴力解法还是比较容易想到的,就是遍历数组,对于当前温度 temperatures[i],遍历之后各天的温度,找到第一个温度高于 temperatures[i] 的 temperatures[j],将 j 存储于answer[i] 中。本来以为会超出时间限制,没想到居然通过了,实现的代码如下。
func dailyTemperatures(temperatures []int) []int {
var length int=len(temperatures)
var answer []int=make([]int, length)
for k, v := range temperatures{
for j:=1; k+j<length; j++{
if temperatures[k+j]>v{
answer[k]=j
break
}
}
}
return answer
}
2、解法2
想一些可以优化的方法,看了答案之后发现可以使用递减栈完成,即维护一个数字大小递减的栈(注意:栈中存储的不是数字,而是对应数字在数组中的下标)。我们对数组进行遍历。
- 当栈为空时,将当前数字入栈。
- 当栈不为空时,与栈顶数字比较:(1)如果当前数字小于栈顶数字,那么将当前数字入栈(2)如果当前数字大于栈顶数字,弹出栈顶数字,栈顶数字对应的 answer 即为当前数字下标-栈顶数字下标。重复上述操作,直到栈为空或者栈顶数字大于当前数字,将当前数字入栈。
实现代码如下
func dailyTemperatures(temperatures []int) []int {
var length int=len(temperatures)
var stack []int
var answer []int=make([]int, length)
for k, v := range temperatures{
for len(stack)>0 && v>temperatures[stack[len(stack)-1]]{ // 栈不为空且栈顶元素小于当前元素
tmp:=stack[len(stack)-1]
answer[tmp]=k-tmp
stack=stack[:len(stack)-1]
}
stack = append(stack, k)
}
return answer
}