Leetcode:350. 两个数组的交集 II(Python 3)

题目:

两个数组的交集 II

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

例如:
给定 nums1 = [1, 2, 2, 1]nums2 = [2, 2], 返回 [2, 2].

注意:

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

跟进:

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

解答:

简单题。

1. 暴力求解:

class Solution:
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        result = []
        for i in nums1:
            if i in nums2:
                result.append(i)
                nums2.remove(i)
                    
        return result
                    

O(n^{2})的时间复杂度,并不好。

2. 题目给了提示,如果这两个数组已经排序,那么只需要一次循环就可以了。

于是,可以先排序,再用一次循环找到结果

class Solution:
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums1.sort()
        nums2.sort()
        result = []
        i = 0
        j = 0
        while i < len(nums1) and j < len(nums2):
            if nums1[i] == nums2[j]:
                result.append(nums1[i])
                i += 1
                j += 1
            elif nums1[i] < nums2[j]:
                i += 1
            else:
                j += 1
        return result
            

时间复杂度就是排序的O(nlogn)

3. 能否在O(n)内完成?

考虑一下hash表,这个东西在Python里面是数据类型dict,将nums1的元素存入dict,然后从dict中查找nums2的元素即可。

dict放什么东西?key为nums1的值,value为这个值出现的次数。

class Solution:
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        if not nums1 or not nums2:
            return []
        result = []
        dict1 = dict()
        for i in nums1:
            if i not in dict1:
                dict1[i] = 1
            else:
                dict1[i] += 1
        for i in nums2:
            if i in dict1:
                if dict1[i] > 0:
                    result.append(i)
                    dict1[i] -= 1
        return result

4. 更简洁的代码(又是别人家的,这家是Python 2):

class Solution(object):
    def intersect(self, nums1, nums2):

        counts = collections.Counter(nums1)
        res = []

        for num in nums2:
            if counts[num] > 0:
                res += num,
                counts[num] -= 1

        return res

这里直接用了Python的built-in,省的自己建一个dict

代码来自https://leetcode.com/problems/intersection-of-two-arrays-ii/discuss/82247/Three-Python-Solutions

5. 还有一行代码搞定的:

def intersect(self, nums1, nums2):
    return list((collections.Counter(nums1) & collections.Counter(nums2)).elements())

discuss区的大牛真的多。

参见https://leetcode.com/problems/intersection-of-two-arrays-ii/discuss/82269/Short-Python-C++

猜你喜欢

转载自blog.csdn.net/SoulOH/article/details/81474449