给定两个数组,编写一个函数来计算它们的交集。
示例 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