Leetcode-探索 | 两个数组的交集 II
Posted STUqza
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode-探索 | 两个数组的交集 II相关的知识,希望对你有一定的参考价值。
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办?
——————————————————————————————————————————————
1. 如果考虑就地处理且不进行预处理的的话思路有限,一开始暴力算法也写得磕磕绊绊,下面是未完成debug的代码:
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 alen1 = len(nums1) 9 alen2 = len(nums2) 10 res = [] 11 12 i = j = 0 13 while i < alen1: 14 j = 0 15 while j < alen2: 16 if nums1[i] == nums2[j]: 17 res.append(nums1[i]) 18 alen1 -= 1 19 alen2 -= 1 20 if alen1 < 1 or alen2 < 1: 21 return res 22 23 if i < alen1: 24 nums1[i] = nums1[alen1] 25 i -= 1 26 if j < alen2: 27 nums2[j] = nums2[alen2] 28 29 j += 1 30 i += 1 31 32 return res
2. 这种情况下要提醒自己此路不通另寻他途,因为算法设计本身并不是一个专精于技巧的事情,要以解决问题为目的,而评价标准也无外乎时空复杂度和算法的简洁性,易理解的特性,鲁棒性等,思考方式要依循数据结构的特点和常用的解决问题的模式/工具/思路方法。这里是否可以使用额外的辅助存储空间解决?
3. 预处理的办法就比较简单了:
4. 一个新元素的引进:哈希。本质上还是引入了一个额外的辅助存储空间,而这个辅助存储空间是一个特殊的数据结构,具有可以随机访问多个同键值元素的特性
以上是关于Leetcode-探索 | 两个数组的交集 II的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 0350. 两个数组的交集 II:哈希/双指针