目录
- 前言
- 总体思路
- 实现代码
前言
leetcode初级算法练习-两个数组的交集 II
一、总体思路
1、常规方法
将两个数组分别进行排序处理,并设定两个指针分别指向排序后的对应数组的首位元素,然后比较两个指针所指向元素的大小,如果相等,则将此元素存入事先准备的空白数组中,如果不相等,小元素对应的指针则后移一位,以此类推,直至指向其中任一数组的尾部。
2、哈希表
首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现的次数,然后遍历第二个数组,对于第二个数组中的每个数字,如果在哈希表中存在这个数字,则将该数字添加到答案,并减少哈希表中该数字出现的次数。
为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。
哈希表方法转载出处:
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/liang-ge-shu-zu-de-jiao-ji-ii-by-leetcode-solution/
来源:力扣(LeetCode)
二、实现代码
1、常规方法代码
def intersect(nums1, nums2):
nums1 = sorted(nums1)
nums2 = sorted(nums2)
n1 = len(nums1)
n2 = len(nums2)
ans = []
i = 0
j = 0
while n1 > i and n2 > j:
n_1 = nums1[i]
n_2 = nums2[j]
if n_1 < n_2:
i = i + 1
elif n_1 > n_2:
j = j + 1
else:
i += 1
j += 1
ans.append(n_1)
return ans
2、哈希表
import collections
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
if len(nums1)>len(nums2):
return self.intersect(nums2, nums1)
m = collections.Counter()
for num in nums1:
m[num] += 1
intersection = list()
for num in nums2:
if m.get(num,0) > 0:
intersection.append(num)
m[num] -= 1
if m[num] == 0:
m.pop(num)
return intersection
三、collections
--- 容器数据类型¶
https://docs.python.org/zh-cn/3/library/collections.html