496 下一个更大元素 I(单调栈)

1. 问题描述:

给你两个没有重复元素的数组 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 中
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i

2. 思路分析:

首先需要理解题目的意思,题目的意思是找到nums1的每一个元素在nums2的对应位置右边第一个比自己大的元素,所以本质上是在nums2中求解每一个元素右边第一个比自己大的元素,如果不存在那么当前位置对应的答案为-1,求解左边/右边比自己小/大的问题都是单调栈的应用(看到这些字眼需要想到单调栈),所以我们直接使用单调栈的模板求解出nums2的每一个元素右边第一个比自己大的元素,然后使用哈希表记录下nums2中每一个元素的位置,最后遍历一下nums1中的所有元素找到在nums2中的位置求解答案即可,主要是单调栈的模板的使用。

3. 代码如下:

from typing import List
import collections


class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        stack = list()
        q = [-1] * len(nums2)
        # 求解nums2的每一个元素右边第一个比自己大的元素
        for i in range(len(nums2)):
            while stack and nums2[stack[-1]] < nums2[i]:
                # 更新答案
                q[stack[-1]] = nums2[i]
                stack.pop()
            # 栈中存储的是元素的下标
            stack.append(i)
        dic = collections.defaultdict(int)
        # 记录一下nums2每一个元素的位置
        for i in range(len(nums2)):
            dic[nums2[i]] = i
        res = list()
        for x in nums1:
            # 找到nums1的元素再nums2的位置中对应的值
            res.append(q[dic[x]])
        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值