739.每日温度

81 阅读1分钟

题目:
给定一个整数数组 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
}