两个数组的交集
难度:
标签:
题目描述
给定两个数组 nums1
和 nums2
,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
代码结果
运行时间: 21 ms, 内存: 16.2 MB
// 思路:
// 1. 将两个数组转换为集合,以便去除重复的元素。
// 2. 使用Java Stream API找出两个集合的交集。
// 3. 将交集转换为数组并返回。
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
public class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 将数组转换为集合
Set<Integer> set1 = Arrays.stream(nums1).boxed().collect(Collectors.toSet());
Set<Integer> set2 = Arrays.stream(nums2).boxed().collect(Collectors.toSet());
// 找到交集并转换为数组
return set1.stream()
.filter(set2::contains)
.mapToInt(Integer::intValue)
.toArray();
}
}
解释
方法:
该题解的思路是先用一个字典myDict记录nums1中每个元素出现的次数(都记为1),然后遍历nums2,如果nums2中的元素在myDict中出现过(即值不为0),就将该元素添加到一个set集合set1中。最后将set1转换为列表返回。通过使用set自动去重的特性,可以确保返回的交集元素都是唯一的。
时间复杂度:
O(m+n)
空间复杂度:
O(m)
代码细节讲解
🦆
为什么将nums1中的每个元素的次数设为1,而不是记录它们的实际出现次数?这会对结果有何影响?
▷🦆
给定题目要求输出结果中的每个元素一定是唯一的,使用set集合存储交集元素的好处是什么?
▷🦆
在遍历nums2时,检查myDict[i] != 0的条件是否足够,或者是否有更严格或有效的条件可以使用?
▷🦆
如果nums1或nums2为空数组,这个解法是否还能正确处理?如果可以,是如何实现的?
▷相关问题
两个数组的交集 II
给你两个整数数组 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]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果
nums1
的大小比nums2
小,哪种方法更优? - 如果
nums2
的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?