350. 两个数组的交集 II

发布时间 2023-10-19 21:09:48作者: Frommoon

题目

  • 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

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

示例 2:

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

法一、排序+双指针

  • 思路:将两个数组进行排序,随后用两个指针分别指向第一个元素,
    当i指向的nums1值小于j指向的nums2值时,i向后移一位;
    当i指向的nums1值等于j指向的nums2值时,把i指向的nums1的值加入输出数组r,并且i,j 都向后移一位;
    当i指向的nums1值大于j指向的nums2值时,j向后移一位;
    最后,输出保存的数组r
class Solution:
    def intersect(self, nums1: [int], nums2: [int]) -> [int]:
        nums1.sort()
        nums2.sort()
        r = []
        i, j = 0, 0
        while i < len(nums1) and j < len(nums2):#以较小的数组长度为结束条件
            if nums1[i] < nums2[j]:
                i += 1
            elif nums1[i] == nums2[j]:
                r.append(nums1[i])
                i += 1
                j += 1    
            else:
                j += 1
        return r

法二、网友一行解法

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list((Counter(nums1) & Counter(nums2)).elements())
  • Counter(nums1)和Counter(nums2)分别用于创建nums1和nums2的计数器对象。计数器对象是一种字典(dictionary)的子类,它将列表中的元素作为键,出现的次数作为对应的值。
  • & 运算符用于对两个计数器对象进行交集操作,得到一个新的计数器对象,其中包含了两个列表中共同出现的元素及其出现次数。
  • elements() 方法返回一个迭代器,用于按照元素的重复次数逐个输出元素。这里使用 list() 函数将迭代器转换为一个列表,以得到最终的结果列表。