题目来源:LeetCode 349: 两个数组的交集
问题抽象: 给定两个整数数组 nums1 和 nums2,要求返回它们的 交集数组,满足以下核心需求:
-
交集定义:
- 输出结果需包含所有 同时存在于两个数组中的元素,且每个元素 仅出现一次(自动去重);
- 结果数组的元素顺序 不限(任意顺序输出均有效)。
-
计算约束:
- 时间复杂度 O(m + n)(
m和n为两数组长度),空间复杂度 O(min(m, n)); - 需通过 哈希集合 实现高效查找:
- 遍历较小数组存入集合(空间优化);
- 遍历较大数组时检查元素是否存在于集合。
- 时间复杂度 O(m + n)(
-
边界处理:
- 若任一数组为空,返回空数组;
- 输入数组可能含重复元素(输出需去重);
- 特殊值:
nums1 = [1,2,2,1],nums2 = [2,2]→ 输出[2];nums1 = [4,9,5],nums2 = [9,4,9,8,4]→ 输出[4,9]或[9,4];
- 元素值范围:
0 ≤ nums1[i], nums2[i] ≤ 1000(可利用有限值域优化)。
输入:两个整数数组 nums1 和 nums2(长度均 ≥0)。
输出:交集元素组成的数组(元素去重,顺序不限)。
解题思路
题目要求计算两个数组的交集,结果中的每个元素必须是唯一的(即去重)。核心思路如下:
- 空间换时间:使用
HashSet存储第一个数组的所有元素(自动去重),时间复杂度为O(m)。 - 快速查找:遍历第二个数组,利用
HashSet的O(1)查找特性判断元素是否在第一个数组中,时间复杂度为O(n)。 - 动态收集结果:使用另一个
HashSet存储交集元素(避免重复添加),最后将其转换为数组返回。
此方法总时间复杂度为O(m+n),空间复杂度为O(m)(最坏情况)。相比排序+双指针法,此方法无需排序且执行效率更高。
代码实现(Java版)🔥点击下载源码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 将 nums1 存入 HashSet 实现去重和快速查找
Set<Integer> set = new HashSet<>();
for (int num : nums1) {
set.add(num);
}
// 用 HashSet 存储结果,自动去重
Set<Integer> resultSet = new HashSet<>();
for (int num : nums2) {
if (set.contains(num)) {
resultSet.add(num);
}
}
// 将结果集转换为数组
int[] result = new int[resultSet.size()];
int index = 0;
for (int num : resultSet) {
result[index++] = num;
}
return result;
}
}
代码说明
-
去重处理:
- 第一个循环将
nums1存入HashSet,自动去除重复元素。 - 第二个循环遍历
nums2时,用resultSet存储交集元素,确保结果无重复。
- 第一个循环将
-
高效查找:
set.contains(num)操作时间复杂度为O(1),整体查找过程为O(n)。
-
结果转换:
- 使用增强for循环将
resultSet转为数组,时间复杂度O(k)(k为结果元素数量)。
- 使用增强for循环将
-
复杂度分析:
- 时间复杂度:O(m + n),其中m、n为数组长度。每个元素最多被遍历两次。
- 空间复杂度:O(m + k),最坏情况
set存储m个元素,resultSet存储k个元素(k ≤ min(m,n))。
提交详情(执行用时、内存消耗)

696

被折叠的 条评论
为什么被折叠?



