这个题目是两个数组I的升级版本。它需要计算出交集的具体个数。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
4种解法:
- 两个hash表
- 对两个列表都生成一个hash表,分别是res1,res2
- 遍历res1,如果res1key在res2中,比较两个value的最小值,然后添加到结果集中去
- 一个hash表
- 只对其中一个列表生成hash表,加入对nums1生成的hash表是res1
- 遍历nums2
- 如果nums2中的元素在res1中且这个元素对应的value值是大于等于1
- 将key添加到结果集中
- 将key对应的value减1
- 如果nums2中的元素在res1中且这个元素对应的value值是大于等于1
- set法
- 对两个集合先去交集,得到结果是temp
- 遍历temp
- 比较temp中元素在nums1和nums2中出现的次数,取最小,设为Min
- 执行添加操作res.extend([num]*Min)
- Counter解法
- 使用Counter得到两个字典
- 然后求交集
- 最后把交集的元素拿出来
- 返回即可
代码:
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
#两个hash表
res1 = collections.defaultdict(int)
res2 = collections.defaultdict(int)
res = []
if not nums1 or not nums2:
return []
for i in nums1:
res1[i]+=1
for i in nums2:
res2[i]+=1
for key,value in res1.items():
if key in res2:
temp = min(value,res2[key])
res.extend([key]*temp)
return res
# 神奇解法
num1 = collections.Counter(nums1)
num2 = collections.Counter(nums2)
num = num1 & num2
return num.elements()
# 一个hahs表
dic = collections.defaultdict(int)
res = []
for i in nums1:
dic[i]+=1
for item in nums2:
if item in dic and dic[item]>=1:
dic[item]-=1
res.append(item)
return res
#set法
temp = set(nums1)&set(nums2)
res = []
for i in temp:
res.extend([i]*min(nums1.count(i),nums2.count(i)))
return res
总结:关于Counter这个方法之后再写一篇博客详细介绍,这个题目还有一个解法就是双指针和之前那个题目一毛一样。如果涉及到出现次数的问题,一般情况还是用hash表。