《Leetcode》350. 两个数组的交集 II

128 篇文章 0 订阅

这个题目是两个数组I的升级版本。它需要计算出交集的具体个数。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

4种解法:

  • 两个hash表
    • 对两个列表都生成一个hash表,分别是res1,res2
    • 遍历res1,如果res1key在res2中,比较两个value的最小值,然后添加到结果集中去
  • 一个hash表
    • 只对其中一个列表生成hash表,加入对nums1生成的hash表是res1
    • 遍历nums2
      • 如果nums2中的元素在res1中且这个元素对应的value值是大于等于1
        • 将key添加到结果集中
        • 将key对应的value减1
  • set法
    • 对两个集合先去交集,得到结果是temp
    • 遍历temp
      • 比较temp中元素在nums1和nums2中出现的次数,取最小,设为Min
      • 执行添加操作res.extend([num]*Min)
  • Counter解法
    • 使用Counter得到两个字典
    • 然后求交集
    • 最后把交集的元素拿出来
    • 返回即可

代码:

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        
        #两个hash表
        res1 = collections.defaultdict(int)
        res2 = collections.defaultdict(int)
        res = []
        if not nums1 or not nums2:
            return []

        for i in nums1:
            res1[i]+=1
        for i in nums2:
            res2[i]+=1
        
        
        for key,value in res1.items():
            if key in res2:
                temp = min(value,res2[key])
                res.extend([key]*temp)
        return res

        # 神奇解法
        num1 = collections.Counter(nums1)
        num2 = collections.Counter(nums2)
        num = num1 & num2
        return num.elements()

        # 一个hahs表
        dic = collections.defaultdict(int)
        res = []
        for i in nums1:
            dic[i]+=1
        
        for item in nums2:
            if item in dic and dic[item]>=1:
                dic[item]-=1
                res.append(item)
                
        return res
        
        #set法
        temp = set(nums1)&set(nums2)
        res = []
        for i in temp:
            res.extend([i]*min(nums1.count(i),nums2.count(i)))

        return res

总结:关于Counter这个方法之后再写一篇博客详细介绍,这个题目还有一个解法就是双指针和之前那个题目一毛一样。如果涉及到出现次数的问题,一般情况还是用hash表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值