(Leetcode) 两个数组的交集 II - Python实现

题目:两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 :
输入: nums1 = [1,2,2,1], nums2 = [2,2],输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4],输出: [4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

-------------------------------------------------------------------------------------

思路:能想到的主要有,直接匹配数组(效率较低),双指针,构建字典。

解法1:双数组,双指针,遍历

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        # 对2个数组进行排序
        nums1.sort()
        nums2.sort()
        # 构建双指针来遍历
        p1, p2 = 0, 0
        res = []
        while p1 < len(nums1) and p2 < len(nums2):
            if nums1[p1] == nums2[p2]:
                res.append(nums1[p1])
                p1 += 1
                p2 += 1
            elif nums1[p1] < nums2[p2]:
                p1 += 1
            else:
                p2 += 1
        return res

解法2:对数组1构建字典(Counter() 方法),跟数组2匹配 

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """

        from collections import Counter
        res = []
        dic1 = Counter(nums1)
        for num in nums2:
            if num in dic1.keys():
                res.append(num)
                dic1[num] -= 1
                if dic1[num] == 0:
                    dic1.pop(num)
        return res

解法3:构建双字典

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """

        from collections import Counter
        res = []
        dic1, dic2 = Counter(nums1), Counter(nums2)
        for num in dic1.keys():
            if num in dic2.keys():
                counts = min(dic1.get(num), dic2.get(num))
                res.extend([num]*counts)
        return res

解法4#:巧用collections + & + elements

注意:list((Counter(nums1)&Counter(nums2)).elements()) 不能省略elements(),否则返回的只有去重的元素。

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """

        from collections import Counter
        return list((Counter(nums1)&Counter(nums2)).elements())

参考:

https://blog.csdn.net/u010788049/article/details/81437834

https://blog.csdn.net/huhehaotechangsha/article/details/80472095

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值