返回
数据结构的妙用:巧解 LeetCode 350 题,轻松找出两个数组的交集 II
后端
2024-02-04 17:40:23
题目背景
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两个数组的交集。交集元素不重复出现,也就是两个数组中共同出现过的元素。
示例 1:
输入:nums1 = [1, 2, 2, 1], nums2 = [2, 2]
输出:[2, 2]
示例 2:
输入:nums1 = [4, 9, 5], nums2 = [9, 4, 9, 8, 4]
输出:[4, 9]
解题思路
解决 LeetCode 350 题的关键在于找出两种数组的交集元素,也就是同时出现在两个数组中的元素。为了实现这一点,我们可以利用数据结构和算法。
哈希表法
哈希表是一种快速查找数据的结构,它将每个元素映射到一个唯一的位置,从而可以在恒定时间内查找元素。使用哈希表来解决这道题,我们可以先将第一个数组 nums1
的元素插入哈希表中,然后遍历第二个数组 nums2
,并检查每个元素是否在哈希表中。如果在,则说明该元素是两个数组的交集元素,将其添加到结果数组中。
Python 代码:
def intersect(nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 创建哈希表
hashtable = {}
# 将第一个数组中的元素插入哈希表
for num in nums1:
if num not in hashtable:
hashtable[num] = 0
hashtable[num] += 1
# 创建结果数组
result = []
# 遍历第二个数组
for num in nums2:
# 如果元素在哈希表中,则说明是交集元素
if num in hashtable and hashtable[num] > 0:
# 将交集元素添加到结果数组中
result.append(num)
# 减少哈希表中该元素的计数
hashtable[num] -= 1
# 返回结果数组
return result
双指针法
双指针法是一种高效的算法,它使用两个指针来遍历两个数组。在这道题中,我们可以使用双指针法来比较两个数组的元素,并将交集元素添加到结果数组中。
Python 代码:
def intersect(nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 排序两个数组
nums1.sort()
nums2.sort()
# 创建两个指针
i = 0
j = 0
# 创建结果数组
result = []
# 遍历两个数组
while i < len(nums1) and j < len(nums2):
# 如果两个元素相等,则说明是交集元素
if nums1[i] == nums2[j]:
# 将交集元素添加到结果数组中
result.append(nums1[i])
# 移动两个指针
i += 1
j += 1
# 如果第一个数组的元素小于第二个数组的元素,则移动第一个指针
elif nums1[i] < nums2[j]:
i += 1
# 如果第一个数组的元素大于第二个数组的元素,则移动第二个指针
else:
j += 1
# 返回结果数组
return result
总结
LeetCode 350 题《两个数组的交集 II》是一道经典的算法题,旨在考察你对数据结构和算法的理解。通过哈希表法和双指针法,我们可以高效地找到两个数组的交集元素。无论你选择哪种方法,重要的是要理解算法背后的原理,并能够将其应用到其他类似的问题中。