题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
解法:
用stack按温度降序保存当天之前的所有日期,当当天温度大于stack.Top()时,意味着可以依次stack.Pop()取出之前的日期和当天的温度比较温度,直到stack.Top()>=当前温度为止停止比较,继续遍历temperatures。
func dailyTemperatures(temperatures []int) []int {
ans := make([]int, len(temperatures))
// stack按温度降序入栈保存没有计算ans的日期
stack := Stack{make([]int, 0)}
for i := 0; i < len(temperatures); i ++ {
// 如果temperatures[i] < stack.Top(),
for !stack.IsEmpty() {
pre_index := stack.Top()
// 如果前一天的温度大于等于当天温度,break,将当前加入到stack中
if temperatures[pre_index] >= temperatures[i] {
break
}
ans[pre_index] = i - pre_index
stack.Pop()
}
stack.Push(i)
}
// 这个步骤可以不要,默认值为0
for !stack.IsEmpty() {
ans[stack.Top()] = 0
stack.Pop()
}
return ans
}
type Stack struct {
Arr []int
}
func (this *Stack) Push(val int) {
this.Arr = append(this.Arr, val)
}
func (this *Stack) Pop() {
this.Arr = this.Arr[:len(this.Arr)-1]
}
func (this *Stack) Top() int {
return this.Arr[len(this.Arr)-1]
}
func (this *Stack) IsEmpty() bool {
return len(this.Arr) == 0
}