LeetCode-739. 每日温度【栈 数组 单调栈】
2023-12-13 05:20:12
LeetCode-739. 每日温度【栈 数组 单调栈】
题目描述:
给定一个整数数组 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 <= 105
30 <= temperatures[i] <= 100
解题思路一:单调栈,顺序遍历数组维护单调递减栈,在出栈的时候得出答案。可以参考LeetCode-503. 下一个更大元素 II【栈 数组 单调栈】
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
stack = []
ans = [0] * n
for i in range(n):
while stack and temperatures[i] > temperatures[stack[-1]]:
ans[stack[-1]] = i - stack[-1]
stack.pop()
# if not stack: ans[i] = 0
stack.append(i)
return ans
时间复杂度:O(n) 一次遍历
空间复杂度:O(n) 单调栈
解题思路二:暴力,从后往前遍历并且维护一个数组nxt,其记录每个温度出现的最小下标。这样每遍历一个数就可以直接得出答案。
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
ans, nxt, big = [0] * n, dict(), 10**9
for i in range(n - 1, -1, -1):
warmer_index = min(nxt.get(t, big) for t in range(temperatures[i] + 1, 102))
if warmer_index != big:
ans[i] = warmer_index - i
nxt[temperatures[i]] = i
return ans
时间复杂度:O(nm),其中 n 是温度列表的长度,m 是数组 next 的长度,在本题中温度不超过 100,所以m 的值为 100。反向遍历温度列表一遍,对于温度列表中的每个值,都要遍历数组 next 一遍。
空间复杂度:O(m),其中 m 是数组 next 的长度。除了返回值以外,需要维护长度为 m 的数组 next 记录每个温度第一次出现的下标位置。
解题思路三:0
文章来源:https://blog.csdn.net/qq_45934285/article/details/134954085
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!