排序3

这篇博客讨论了如何使用Python高效地计算两个已排序数组的交集。通过两种不同的方法,包括使用列表和字典,展示了如何在不改变原始数组的情况下找到交集。文章还提到了字典的key检查技巧以及列表转化为字典的不同方式。
摘要由CSDN通过智能技术生成

给定两个数组,编写一个函数来计算它们的交集。

示例 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}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值