给定两个数组,编写一个函数来计算它们的交集
- 描述
- leetCode:leetcode-cn.com/problems/in…
- 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]
- 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4]
- 说明
- 输出结果中的每个元素一定是唯一的
- 我们可以不考虑输出结果的顺序
- 解题思路
- 由于Set元素不可重复,故可将数组1遍历后存储进Set1,然后遍历数组2并使用Set1的contains方法逐个调用,包含时加入到Set2中,最终把Set2转换为数组即可
- 时间复杂度 O(m+n);空间复杂度O(m+n)
- Java代码实现:
/**
* 求两个数组的交集
*
* @param array1 数组1
* @param array2 数组2
* @return 数组的交集
*/
private static int[] getIntersection1(int[] array1, int[] array2) {
if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {
return null;
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
Arrays.stream(array1).forEach(set1::add);
Arrays.stream(array2).forEach(i -> {
if (set1.contains(i)) {
set2.add(i);
}
});
return set2.stream().mapToInt(Integer::intValue).toArray();
}
延伸:假如给定的是两个有序数组
-
描述
- 输入:nums1 = [1,2,4,8], nums2 = [2,5] 输出: [2]
-
解题思路
- 做while循环,条件是数组1的下边index1 < 数组1.length 并且 数组2的下边index2 < 数组2.length,执行体中对相应下标下的值作比较,相等添加进Set集合中表示交集,并对index1++,index2++;array1[index1]>array2[index2]时对index2++,小于时index1++,最终将set转为数组即可。
- 时间复杂度 O(max(m,n));空间复杂度O(min(m,n))
- Java代码实现:
private static int[] getIntersection2(int[] array1, int[] array2) {
if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {
return null;
}
int index1 = 0, index2 = 0;
Set<Integer> set = new HashSet<>();
while (index1 < array1.length && index2 < array2.length) {
if (array1[index1] < array2[index2]) {
index1++;
} else if (array1[index1] == array2[index2]) {
set.add(array1[index1]);
index1++;
index2++;
} else {
index2++;
}
}
return set.stream().mapToInt(Integer::intValue).toArray();
}