题目:
给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的,可以不考虑输出结果的顺序。
Python3代码解答:
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
# 创建一个空的字典table来存储nums1数组中的所有元素
table = {}
# 遍历nums1数组,每个元素作为字典的键,值为该元素在数值中出现的次数
for num in nums1:
# table.get(num, 0):这部分代码尝试在字典table中查找键num
# 如果num在字典table中存在,那么会返回num对应的值(即num出现的次数)
# 如果num不在字典中,那么会返回默认值0
# 将字典table中键num的值(即num出现的次数)增加1,然后更新table中num对应的值
table[num] = table.get(num, 0) + 1
# 创建一个空的集合,存储交集的结果
res = set()
# 遍历nums2数组的每个元素,检查是否在table中
for num in nums2:
if num in table:
# 如果元素在字典中存在,说明在nums1数组中出现过,就把该元素添加集合res中
res.add(num)
# 一旦找到这个元素,就从table中删除这个元素,以避免重复查找
del table[num]
# 最后将res集合返回
return list(res)
上述代码实现解释:
上述代码的实现过程是通过哈希表(字典)存储nums1
中的所有元素,然后遍历nums2
数组,查找与nums1
数组的交集部分,并将结果存储在集合res
中,最后将集合转换为列表并返回,具体实现过程如下:
-
函数签名:
intersection
是类Solution
中的一个方法。- 它接受两个参数:
nums1
和nums2
,它们都是列表(List[int]),分别代表两个数组。 - 函数的返回值是一个列表,其中包含两个数组的交集部分。
-
哈希表存储:
- 首先,函数创建了一个空的字典
table
来存储nums1
数组中的所有元素。 - 然后,遍历
nums1
数组,将每个元素作为字典的键,值为该元素在数组中出现的次数。 - 这样做的好处是,字典
table
记录了nums1
中所有元素,并且可以很快地判断一个元素是否在nums1
中。
- 首先,函数创建了一个空的字典
-
查找并记录交集:
- 创建一个空的集合
res
,用于存储两个数组的交集部分。 - 遍历
nums2
数组的每个元素,检查它是否在字典table
中。 - 如果元素在字典中存在,说明它在
nums1
数组中出现过,就将该元素添加到res
集合中。 - 一旦找到了这个公共元素,程序就从
table
中删除这个元素,以避免重复查找和处理。
- 创建一个空的集合
-
返回结果:
- 最后,将
res
集合转换成列表并返回。 - 使用集合
res
来存储交集部分的好处是,可以自动去除重复元素,并保持结果的唯一性。
- 最后,将
难点代码解释:
对于这个题目,我们不好理解的就是:table[num] = table.get(num, 0) + 1这个代码的意思,具体的解释如下:
-
语法:
table[num] = table.get(num, 0) + 1
这一句代码对字典table
进行操作。 -
解释:代码分为两个部分:
table.get(num, 0)
:这部分代码尝试在字典table
中查找键num
。- 如果
num
在字典table
中存在,那么会返回num
对应的值(即num
出现的次数)。 - 如果
num
不在字典中,那么会返回默认值0
,因为table.get(num, 0)
中的0
是指定的默认值。
- 如果
table[num] = table.get(num, 0) + 1
:这一部分将字典table
中键num
的值(即num
出现的次数)增加1,然后更新table
中num
对应的值。
如果不理解的话,我们可以将这个代码进行拆分理解:
-
检查元素是否在字典中:
count = table.get(num, 0) # 获取 num 在 table 中的值,如果不存在则返回 0
- 首先,我们通过
table.get(num, 0)
来获取元素num
在字典table
中的值(num
代表一个元素(键),而这个元素在字典中对应的值是num
在数组中出现的次数)。 注:(num
在table
中对应的值代表num
在数组中出现的次数。如果num
在数组中出现了2次,那么table
中num
对应的值就是2
。如果num
没有出现过,或者从未被记录过,那么返回的值将是默认值0) get
方法的第一个参数是要查找的键num
,第二个参数是默认值0
,如果num
在字典中不存在,那么就会返回默认值0
。
- 首先,我们通过
-
更新元素的频次:
count += 1 # 将 num 的次数增加 1
- 现在我们已经得到了
num
在字典table
中的值(出现的次数)count
。 - 接下来,我们将这个值
count
加1
,因为我们在nums1
数组中遇到了这个元素一次。
- 现在我们已经得到了
-
更新字典:
table[num] = count # 将更新后的次数存储回字典
- 最后,将更新后的次数
count
存储回字典table
中。 - 这样
num
作为键,count
作为值被更新到字典table
中。
- 最后,将更新后的次数
将这三步合并在一起,就是table[num] = table.get(num, 0) + 1
。每次遇到一个元素num
时,它会检查字典table
中是否已经存在这个元素,然后更新元素的频次。
本文的对于力扣349. 两个数组的交集的Python3解答,仅仅是个人学习资料记录,也十分高兴我的见解可以帮助其他的正在做这个题目的同学,基础较差,仅仅是个人见解,大神勿喷,欢迎交流,谢谢!