题目:两个数组的交集 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