给定两个数组,编写一个函数来计算它们的交集。 示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
看完问题描述 发现看似简单 但是其实有一点点的难 难点在于如果2个数组中存在重复数字,则交集也必须重复
先说下 自己当时的想法
没有想到什么简单方法 只能使用蛮力法 通过两层循环 每一个数字与另外一个数组中的数字对比。并且加一个判断,如果相同则在之后的对比时不对比此下标的值
上代码(通过-用时110ms)
1 class Solution: 2 3 def intersect2(self, nums1, nums2): 4 """ 5 :type nums1: List[int] 6 :type nums2: List[int] 7 :rtype: List[int] 8 """ 9 result = [] 10 11 for i in nums1: 12 for j in nums2: 13 if i == j: 14 result.append(i) #插入交集 15 nums2.remove(j) #插入过的值不再出现 16 break 17 return result 18 if __name__=="__main__": 19 nums1=[1,2,2,1] 20 nums2=[1,2] 21 s=Solution() 22 print(s.intersect(nums1,nums2))
这个是笔者想到的方法。使用蛮力法,比较耗时,需要110ms。
然后上评论区大佬的代码(特别赏心悦目 5行代码解决问题)
1 class Solution(object): 2 def intersect(self, nums1, nums2): 3 """ 4 :type nums1: List[int] 5 :type nums2: List[int] 6 :rtype: List[int] 7 """ 8 inter = set(nums1) & set(nums2) #inter为两个list的相同元素 9 l = [] 10 for i in inter: 11 l += [i] * min(nums1.count(i), nums2.count(i)) #相同元素的共同出现次数 12 return l
这个方法比较难想,是一个很有趣的解法
思想:通过set的唯一性找出两list的唯一交集,再利用min方法找到交集的共同出现次数
前面方法的效率较低 介绍一种方法使用字典进行查找
思想:通过key,value进行存储,key为值的个数,value为值。 先把nums1存放入字典中。遍历nums2中的值对比字典,相同则数量减一并放入list中,最后返回list
1 class Solution: 2 #利用字典实现交集 3 def intersect(self,nums1,nums2): 4 record={} 5 result=[] 6 for i in nums1: 7 # 注意python3.x用contains()方法取代has_key() 8 if(record.__contains__(i)): 9 record[i]+=1 #将字典的key值数+1 10 else: 11 record[i]=1 #将i加入字典中 key为1 12 for j in nums2: 13 if(record.__contains__(j) and record[j]>0): 14 record[j]-=1 #i的key值减1 15 result.append(j) 16 return result 17 if __name__=="__main__": 18 s=Solution() 19 num1=[1,2,3,4,4,1] 20 num2=[4,2,3] 21 print(s.intersect(num1,num2))
值得注意的是:python 3.x的版本将has_key()方法换为_contains_()
会发现通过时间为48ms 效率有所提升
原文:https://www.cnblogs.com/bob-jianfeng/p/10370307.html