python(leetcode)-350两个数组的交集

摘要:
如果nums2的元素存储在磁盘上,那么磁盘内存是有限的,并且不能一次将所有元素加载到内存中,那么应该怎么办?然后,代码1 classSolution:2definitherect:3“”4:typenums1:List[int]5:typenums2:List[it]6:rtype:List[in]7“”8inter=set&set#inter是两个列表中的相同元素9l=[]10foriininter:11l+=[i]*min#同一元素12return的常见出现次数这个方法很难想象。这是一个有趣的解决方案:通过集合的唯一性找到两个列表的唯一交集,然后使用min方法找到交集的常见出现时间。前一种方法的效率很低。本文介绍了一种使用字典查找思想的方法:按关键字和值存储。Key是值的数量,value是值。
给定两个数组,编写一个函数来计算它们的交集。

示例 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 效率有所提升

免责声明:文章转载自《python(leetcode)-350两个数组的交集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jsp_类的封装_集合的应用使用腾讯语音合成技术生成有声书下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python中多进程multiprocessing、多线程threading、线程池threadpool

浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一、多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=threading.Thread(target=函数名,args=(参数,))——t.start()——while threading.active_coun...

python读取文件时出现多余的ufeff时的解决方法及原因

当使用python读取文件后打印结果意外多出了一个ufeff,如图: 那要如何解决呢?其实也很简单只要将encoding = 'utf-8' 改成encoding = 'UTF-8-sig'就搞定了,如图: 问题是解决了,但是这到底是什么原因呢? 答:在编写文本时保存时包含了BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Un...

python自动化测试-D9-学习笔记之一(线程池)

# 封装 线程池import threadpoolclass MyPool(object):def __init__(self,func,size=20,data=None):#func 函数,size线程数,data数据self.func = funcself.size = sizeself.data = dataself.pool()def pool(...

一个用python简单的封装了aria2的jsonrpc中adduri的脚本

aria2是一个十分牛逼的下载神器,有时候项目需要一个很牛逼的下载中间件的话,aria2是一个不错的选择。其中支持jsonrpc和websocket的特性尤其诱人。但是python用起来还是有点不爽,所以简单封装一下aria2的jsonrpc。 所以,用python简单的封装了aria2的jsonrpc中adduri的脚本。 使用起来非常简单,仅需要三行代...

django之表多对多查询

1 class Boy(models.Model): 2 name = models.CharField(max_length=32) 3 4 class Girl(models.Model): 5 nick = models.CharField(max_length=32) 6 7 class Love(...

Python打开文件报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape

#path 是文件路径 f=open('C:UsersjingqiuDesktopNew Text Document.txt') 结果报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX esc...