算法题(Python)哈希表 | 2.两个数组的交集
题目描述
给定两个数组nums1和nums2,返回它们的交集。输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。
示例1:
输入:nums1 = [1, 2, 2, 1], nums = [2, 2]
输出:[2]
示例2:
输入:nums1 = [4, 9, 5], nums = [9, 4, 9, 8, 4]
输出:[9, 4]
解释:[4, 9]也是可以通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路
本题,主要要学会使用一种哈希数据结构:unordered_set。
注意题目特意说明:输出结果中的每个元素一定是唯一的,也就是说,输出的结果是去重的,同时可以不考虑输出结果的顺序。
需要注意的是:使用数组做哈希的题目,是因为题目都限制了数值的大小。如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
此时需要使用另一种结构体,set,关于set,C++提供了如下三种可用的数据结构:
- std::set
- std::multiset
- std::unordered_set
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表,使用unordered_set读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
思路如下图所示:

代码如下:
python
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 使用数组
count1 = [0] * 1001
count2 = [0] * 1001
result = []
for i in range(len(nums1)):
count1[nums1[i]] += 1
for i in range(len(nums2)):
count2[nums2[i]] += 1
for k in range(1001):
if count1[k] * count2[k] > 0:
result.append(k)
return result
python
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 使用哈希表存储一个数组中的所有元素
table = {}
for num in nums1:
table[num] = table.get(num, 0) + 1
# 使用集合存储结果
res = set()
for num in nums2:
if num in table:
res.add(num)
del table[num]
return list(res)