LeetCode.350. 两个数组的交集 II

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

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

示例 2:

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

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。

进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

思路1:

使用collections模块的Counter函数分别对两个函数的元素进行计数,求与集之后留下相同数字的元素。

代码1:

class Solution:
    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())

分析1:

使用了模块函数加快效率,时间复杂度O(n),空间复杂度O(1)

思路2:

建立字典遍历nums1统计nums1中每个元素的个数,然后遍历nums2,看每个数字是否在统计中,若是则将其加入答案中,并且将统计中的个数减一。

代码2:

class Solution:
    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())
        record={}
        res=[]
        for num in nums1:
            record[num]=record.get(num,0)+1
            #get方法若是字典中没有此元素num,则返回你指定的第二个参数
        for num in nums2:
            if num in record and record[num]!=0:
                res.append(num)
                record[num]-=1
        return res

分析2:

哈希表的操作效率极高。
时间复杂度O(n),空闲复杂度O(n)

思路3:

来自LeetCode本题最快Python答案。
思路与思路2类似也是建立字典,但是每个键的值是一个两数列表,分别记录本数字在两个数组中的出现次数,加入时取两数列表中较小的一个数字(出现较少的次数)为次数加入返回列表。

代码3:

class Solution:
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        dic={}
        ans=[]
        for i in nums2:
            if i in dic:
                dic[i][0]+=1
            else:
                dic[i]=[1,0]
        for i in nums1:
            if i in dic:
                dic[i][1]+=1
        for i in dic:
            if dic[i][1]!=0:
                a=min(dic[i])
                for j in range(a):
                    ans.append(i)
        return ans

分析3:

对于每个重复数字,只处理一次。这在重复数字重复次数较多时会有较快效率。
时间复杂度O(n),空间复杂度O(n)

参考:

Python字典的get方法:http://www.runoob.com/python3/python3-att-dictionary-get.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值