题目简述
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现
在几天后。如果气温在这之后都不会升高,请在该位置用 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 <= 10⁵
30 <= temperatures[i] <= 100
思路分析
此题要获取下一个最大的值。【Leetcode】1019-链表中的下一个更大节点题也采用了一样的思想,使用单调栈以较少时间消耗来求解。
为什么获取下一个最大/最小的值这种问题适合使用单调栈来求解呢?
因为单调栈具有栈内元素从栈底到栈顶逐渐增加(或减少)的条件,使得可以在原数组(或其他数据结构)的一次遍历中,通过入栈时比较判断、出栈时获取结果的方式来求解每一个元素下一个最大/最小的值。
在单调栈中,元素是动态进出栈的,即新元素进栈的同时可能也会有旧元素出栈。遍历时,假设每个元素都没有下一个最大/最小的值,则经过每个元素时都会先将其入栈,同时会将该元素与栈内元素(从栈顶向栈底)比较大小以判断自己是不是之前所经过元素的下一个最大值:(1)对于求下一个最大值的问题,会将值更小的元素全部出栈,每个元素出栈时即求得下一个最大值就是当前要入栈的元素;(2)对于求下一个最小值的问题,会将值更大的元素全部出栈,同理每个元素出栈时即求得下一个最小值就是当前要入栈的元素。
代码示例
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack_uncertian_day = []
res = [0] * len(temperatures) # 初始化结果,假设每个元素都没有下一个最大值,
for i in range(0, len(temperatures)):
while stack_uncertian_day and temperatures[i] > temperatures[stack_uncertian_day[-1]]:
day = stack_uncertian_day.pop()
res[day] = i - day
stack_uncertian_day.append(i)
return res
复杂度分析
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
n
)
O(n)
O(n)