leetcode496下一个更大元素I

本文探讨了如何在给定两个无重复元素的数组情况下,找到第一个数组中每个元素在第二个数组中的下一个更大值。通过对比不同解法,包括暴力解法、改进版暴力解法以及高效利用栈和哈希表的方法,详细解析了每种方法的实现思路和时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。

示例一

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。

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

思路 :第一个数组每个数和第二个数组中的数对比nums1(i),找出第二个数组中与之相等的数nums2(j),和二数组中后面的数字挨个比大小,比nums2(j)大的话写入,不存在写入-1
这算什么思路简直就是暴力解法无脑操作,就这一开始还编错了,白中白进化过程怎么就这么难呢 讲真编程厉害的人脑子里是不都有一个搭好的楼梯啊 羡慕

class Solution(object):
    def nextGreaterElement(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        y = [];
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                if nums1[i] == nums2[j]:
                    if j+1 == len(nums2):
                        y.append(-1)
                    else: 
                        T = 1
                        for k in range(j+1,len(nums2)):
                            if nums2[k]>nums2[j]:
                                y.append(int(nums2[k]))
                                T = 0
                                break
                        if T:
                            y.append(-1) 
        return y
                

改进写法

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        new = []
        for i in nums1:
            index = nums2.index(i)
            for j, n in enumerate(nums2[index:]):
                if n > i:
                    new.append(n)
                    break
                # 判断到了最后一个元素
                if j + 1 == len(nums2[index:]):
                    new.append(-1)
        return new

但是这种解法时间复杂度很高
利用栈和哈希表的思路解题:

class Solution(object):
    def nextGreaterElement(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        stack, hash = [], {}
        for n in nums2:
            while stack and stack[-1] < n:
                hash[stack.pop()] = n  # 当nums2的后面存在比它大存入哈希表 不存在就不管
            stack.append(n)
        
        return [hash.get(x, -1) for x in nums1]

dic.get(key,default) 当查找键值找不到时就返回默认值-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值