739. 每日温度
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
单调栈
单调栈是一种特殊的栈结构,用于解决类似于“下一个更大元素”这样的问题。对于本题,我们可以维护一个存储数组下标的单调递减栈。
- 遍历温度列表,对于每一天的温度:
- 检查栈是否为空,以及当前温度是否大于栈顶元素指向的温度。
- 如果是,则说明我们找到了栈顶元素的下一个更高温度。计算两者的索引差,更新答案数组,并将栈顶元素弹出。
- 重复此过程,直到当前温度不再大于栈顶元素指向的温度,或栈为空。
- 将当前温度的索引压入栈中。
- 如果栈中仍有元素,这意味着它们后面没有更高的温度了,对应的答案数组位置应该是0(这通常是栈初始化时的默认值)。
def dailyTemperatures(T: [int]) -> [int]:
n = len(T)
ans = [0] * n
stack = []
for i in range(n):
temperature = T[i]
while stack and temperature > T[stack[-1]]:
prev_index = stack.pop()
ans[prev_index] = i - prev_index
stack.append(i)
return ans
# 测试代码
temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
print(dailyTemperatures(temperatures)) # 应该输出 [1, 1, 4, 2, 1, 1, 0, 0]
496.下一个更大元素 I
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出-1 。
提示:
- 1 <= nums1.length <= nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 10^4
- nums1和nums2中所有整数 互不相同
- nums1 中的所有整数同样出现在 nums2 中
单调栈加哈希表
-
处理
nums2
:- 使用一个单调栈来维护一个递减序列。
- 创建一个哈希表来存储
nums2
中每个元素的下一个更大元素。 - 遍历
nums2
,对于每个元素:- 当栈不为空且当前元素大于栈顶元素时,弹出栈顶元素,将其与当前元素的映射添加到哈希表中。
- 将当前元素压入栈中。
- 遍历结束后,栈中剩余的元素在
nums2
中没有下一个更大元素,它们在哈希表中的映射值为-1
。
-
处理
nums1
:- 遍历
nums1
,使用哈希表找到每个元素在nums2
中的下一个更大元素。
- 遍历
def nextGreaterElement(nums1, nums2):
stack, hashMap = [], {}
for num in nums2:
while stack and num > stack[-1]:
hashMap[stack.pop()] = num
stack.append(num)
while stack:
hashMap[stack.pop()] = -1
return [hashMap[num] for num in nums1]
# 测试代码
nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
print(nextGreaterElement(nums1, nums2)) # 输出 [-1, 3, -1]
nums1 = [2, 4]
nums2 = [1, 2, 3, 4]
print(nextGreaterElement(nums1, nums2)) # 输出 [3, -1]