题目链接
题目描述
请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 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
解题思路
使用栈保存不高于栈顶温度的温度下表,符合下列两种情况时进栈:
1.栈为空,说明当前温度最高
2.当前温度小于栈顶温度
当当前温度大于栈顶温度时,弹出栈顶温度,通过当前温度下标减去弹出栈顶温度下标来赋值给弹出栈顶温度下标
然后继续计算当前温度和新的栈顶温度的关系
代码
Python
class Solution:
def dailyTemperatures(self, temperatures: list[int]) -> list[int]:
ans = [0 for _ in range(len(temperatures))]
stack = []
i = 0
while i < len(temperatures):
if not stack or temperatures[stack[-1]] >= temperatures[i]:
stack.append(i)
else:
while stack and temperatures[stack[-1]] < temperatures[i]:
idx = stack.pop()
ans[idx] = i - idx
stack.append(i)
i += 1
return ans
Go
type stack []int
func (s *stack) push(i int) {
*s = append(*s, i)
}
func (s *stack) pop() int {
a := *s
i := a[len(a)-1]
*s = a[:len(a)-1]
return i
}
func dailyTemperatures(temperatures []int) []int {
n := len(temperatures)
ans := make([]int, n)
var s stack
for i := 0; i < n; i++ {
if len(s) == 0 || temperatures[s[len(s)-1]] >= temperatures[i] {
s.push(i)
} else {
for len(s) != 0 && temperatures[s[len(s)-1]] < temperatures[i] {
idx := s.pop()
ans[idx] = i - idx
}
s.push(i)
}
}
return ans
}