给定两个数组,编写一个函数来计算它们的交集。
示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
mylist = []
for i in nums1:
if i in nums2 and len(nums2) != 0:
mylist.append(i)
nums2.remove(i)
return mylist
if __name__ == '__main__':
res = Solution()
rt = res.intersect([1,2,2,1],[2,2])
print(rt)
复习了list的remove函数,是在源列表上操作,会改变源列表
但是我的代码运行时间还有运行内存太高,故而我换成如下操作:
思路:用字典
把list的各个元素当做key值,value值同一为1,有key有重复的话,value加1
第二个列表对比,且满足key所对应的value不等于0的条件下,才会追加mylist列表
class Solution:
def func(self,nums1,nums2):
mydict = {}
mylist = []
for j in range(len(nums1)):
mydict[nums1[j]] = 0
for i in range(len(nums1)):
if nums1[i] in nums1:
mydict[nums1[i]] += 1
else:
mydict[nums1[i]] = 1
for iter in range(len(nums2)):
if mydict.__contains__(nums2[iter]) and mydict[nums2[iter]] > 0:
mylist.append(nums2[iter])
mydict[nums2[iter]] -= 1
return mylist
if __name__ == '__main__':
res = Solution()
rt = res.func([1,2,2,1],[2,2])
print(rt)
总结:dict的key检查是否在这个字典中,Python2中是用has_key()函数,而在python3中删了这个函数,可以用__contains__方法。还有列表转化为字典的方法。这是一个列表转化为字典的方法。
两个列表转化字典的方法有dict(zip(列表1,列表2));其中列表1为key,列表2为value,且一短的列表为标尺。例如:
>>> a
[1, 2, 2, 3, 4]
>>> b
[12, 34, 4, 123, 123, 4534, 1323, 423434]
>>> dict(zip(a,b))
{1: 12, 2: 4, 3: 123, 4: 123}