0349. 两个数组的交集
大约 2 分钟
0349. 两个数组的交集
- 标签:数组、哈希表、双指针、二分查找、排序
- 难度:简单
题目链接
题目大意
描述:给定两个数组 和 。
要求:返回两个数组的交集。重复元素只计算一次。
说明:
- 。
- 。
示例:
- 示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
- 示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
解题思路
思路 1:哈希表
- 先遍历第一个数组,利用哈希表来存放第一个数组的元素,对应字典值设为 。
- 然后遍历第二个数组,如果哈希表中存在该元素,则将该元素加入到答案数组中,并且将该键值清空。
思路 1:代码
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
numDict = dict()
nums = []
for num in nums1:
if num not in numDict:
numDict[num] = 1
for num in nums2:
if num in numDict and numDict[num] != 0:
numDict[num] -= 1
nums.append(num)
return nums
思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。
思路 2:分离双指针
- 对数组 、 先排序。
- 使用两个指针 、。 指向第一个数组的第一个元素,即:, 指向第二个数组的第一个元素,即:。
- 如果 等于 ,则将其加入答案数组(注意去重),并将 和 右移。
- 如果 小于 ,则将 右移。
- 如果 大于 ,则将 右移。
- 最后返回答案数组。
思路 2:代码
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1.sort()
nums2.sort()
left_1 = 0
left_2 = 0
res = []
while left_1 < len(nums1) and left_2 < len(nums2):
if nums1[left_1] == nums2[left_2]:
if nums1[left_1] not in res:
res.append(nums1[left_1])
left_1 += 1
left_2 += 1
elif nums1[left_1] < nums2[left_2]:
left_1 += 1
elif nums1[left_1] > nums2[left_2]:
left_2 += 1
return res
思路 2:复杂度分析
- 时间复杂度:。
- 空间复杂度:。