代码随想录算法训练营Day 57 || 739. 每日温度、496.下一个更大元素 I

739. 每日温度

力扣题目链接(opens new window)

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。


单调栈

单调栈是一种特殊的栈结构,用于解决类似于“下一个更大元素”这样的问题。对于本题,我们可以维护一个存储数组下标的单调递减栈。

  1. 遍历温度列表,对于每一天的温度:
    • 检查栈是否为空,以及当前温度是否大于栈顶元素指向的温度。
    • 如果是,则说明我们找到了栈顶元素的下一个更高温度。计算两者的索引差,更新答案数组,并将栈顶元素弹出。
    • 重复此过程,直到当前温度不再大于栈顶元素指向的温度,或栈为空。
    • 将当前温度的索引压入栈中。
  2. 如果栈中仍有元素,这意味着它们后面没有更高的温度了,对应的答案数组位置应该是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

力扣题目链接(opens new window)

给你两个 没有重复元素 的数组 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 中
单调栈加哈希表
  1. 处理 nums2

    • 使用一个单调栈来维护一个递减序列。
    • 创建一个哈希表来存储 nums2 中每个元素的下一个更大元素。
    • 遍历 nums2,对于每个元素:
      • 当栈不为空且当前元素大于栈顶元素时,弹出栈顶元素,将其与当前元素的映射添加到哈希表中。
      • 将当前元素压入栈中。
    • 遍历结束后,栈中剩余的元素在 nums2 中没有下一个更大元素,它们在哈希表中的映射值为 -1
  2. 处理 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值