LeetCode-739. 每日温度【栈 数组 单调栈】
- 题目描述:
- 解题思路一:单调栈,顺序遍历数组维护单调递减栈,在出栈的时候得出答案。可以参考[LeetCode-503. 下一个更大元素 II【栈 数组 单调栈】](https://blog.csdn.net/qq_45934285/article/details/134950524?spm=1001.2014.3001.5501)
- 解题思路二:暴力,从后往前遍历并且维护一个数组nxt,其记录每个温度出现的最小下标。这样每遍历一个数就可以直接得出答案。
- 解题思路三:0
题目描述:
给定一个整数数组 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] * nfor 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**9for 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 - inxt[temperatures[i]] = ireturn ans
时间复杂度:O(nm),其中 n 是温度列表的长度,m 是数组 next 的长度,在本题中温度不超过 100,所以m 的值为 100。反向遍历温度列表一遍,对于温度列表中的每个值,都要遍历数组 next 一遍。
空间复杂度:O(m),其中 m 是数组 next 的长度。除了返回值以外,需要维护长度为 m 的数组 next 记录每个温度第一次出现的下标位置。
解题思路三:0