496. 下一个更大元素 I

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 。

提示:

nums1和nums2中所有元素是唯一的。
nums1和nums2 的数组大小都不超过1000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

  1. 将nums2是无重复元素的数组,新建一个字典dic,key是nums2中的元素,value是相应元素的位置。
  2. 新建保存结果的空列表result
  3. 遍历变量nums1中的元素,通过dic找出他在nums2中的位置i,如果nums2[i:]的最大值没有比当前值大的,-1加入result.否则,遍历nums2[i:],如果有大于当前值的,保存到result,否则,保存-1到result

我的解答

class Solution:
    def nextGreaterElement(self, nums1, nums2):
        dic = {}
        result = []
        for i,item in enumerate(nums2):
            dic[item] = i
        l = len(dic)
        for item in nums1:
            i = dic[item]
            if max(nums2[i:])<= item:
                result.append(-1)
            else:
                for temp in nums2[i:]:
                    if temp>item:
                        result.append(temp)
                        break
        return result

官方解答

哈希映射
维护nums2中的元素,字典中保存下一个比当前值大的值

  1. 新建空栈stack,字典dic
  2. 遍历nums2中的元素–item
    如果栈为空或者当前元素小于栈顶值,将item压入栈
    否则弹出栈顶值作为keydic[key]=item,将item压入栈

这两句话直译为

dic = {}
result = []
stack = []
for item in nums2:
    if len(stack)>0 and stack[-1]>item :# stack[-1]  index outof range
        stack.append(item)
    elif len(stack) == 0:
        stack.append(item)

    else:
        while len(stack)>0:
            dic[stack.pop(-1)] = item
        stack.append(item)

翻译一下

  1. 当stack不为空且栈顶值<item时,需要弹出顶值最为key,item为value,直到栈为空或栈顶值>item.
  2. item压入栈中

nums2中的每个元素都有一次入栈和出栈动作。

dic = {}
result = []
stack = []
for item in nums2:
    while len(stack) > 0 and stack[-1] < item:
        dic[stack.pop(-1)] = item
    stack.append(item)

完整版

class Solution:
    def nextGreaterElement(self, nums1, nums2):
        dic = {}
        result = []
        stack = []
        for item in nums2:
            # if len(stack)>0 and stack[-1]>item :# stack[-1]  index outof range
            #     stack.append(item)
            # elif len(stack) == 0:
            #     stack.append(item)
            #
            # else:
                while len(stack)>0 and stack[-1]<item:
                    dic[stack.pop(-1)] = item
                stack.append(item)
        # print(dic)

        for item in nums1:
            if item in dic:
                result.append(dic[item])
            else:
                result.append(-1)
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值