题目描述:
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路:
题目要求我们返回两个数组中的交集,我们稍微转换一下,就可以得到我们需要实现*返回两个数组中重复的元素!*那么我们最容易想到的就是先定义两个集合将数组中的元素存储进去(由于题目只需要返回两个集合的重复元素,我们为了方便实现查找相同元素操作,选用HashSet集合,存入数组中的元素且只存入一次(若元素出现超过两次,只会在集合中存入一次)),接着我们再遍历一个集合,同时检查元素是否存在于另一个集合中,再将重复的元素存入数组中返回即可,但是我们应该注意以下一点:
1.为不遗漏重复元素,我们必须遍历较短的集合,在较长的集合中检查是否存在重复的元素.
代码:
class Solution {
//HashSet
//Time Complexity: O(M + N)
//Space Complexity: O(M + N)
//M,N is the length of nums
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set01 = new HashSet<>();
HashSet<Integer> set02 = new HashSet<>();
//添加数据到集合中
for (int num : nums1) {
set01.add(num);
}
for (int num : nums2) {
set02.add(num);
}
//调用辅助函数
return merge(set01, set02);
}
//辅助函数(返回两个集合重复的元素)
public int[] merge(Set<Integer> set01, Set<Integer> set02) {
//如果set01的长度大于set02
//再次调用merge,并传入set02,set01
if (set01.size() > set02.size()) {
return merge(set02,set01);
}
//定义一个新的集合,便于转换为结果数组
Set<Integer> mergeSet = new HashSet<>();
//遍历较短的集合
for (int num : set01) {
//判断是否存在于较长集合中
if (set02.contains(num)) {
//集合添加重复元素
mergeSet.add(num);
}
}
//将集合转化为数组
int[] res = new int[mergeSet.size()];
int index = 0;
for (int num : mergeSet) {
res[index++] = num;
}
return res;
}
}
部分操作分析:
//如果set01的长度大于set02
//再次调用merge,并传入set02,set01
if (set01.size() > set02.size()) {
return merge(set02,set01);
}
我们为了确保是先遍历较短的集合,在较长的集合中查重,就要先判断两个集合大小的关系,如果set01的大小大于set02的大小,我们就选择将两个集合对调位置重新传入函数中保证我们接下来的操作是对较长的集合遍历!!!