题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
本题思路很明确就是判断两个数组中相同的元素,而且这个元素一定是唯一的,这样的话就用到了set。集合的特点就是对放入其中的元素去重。(当然这个地方也可以用到双指针法,就是将最后相同的元素不管重复不重复,放到一个新的数组中,然后对这个数组进行双指针操作,将一个数组看作两个,来去重,但这样的实践复杂度还是O(n)--因为前面要用双重for来判断相同元素,然后在比较,这样没有直接用set来的快)
第一中思路:双重for将相同的元素放到集合中输出即可;
第二种方法:用到set中的一个remove方法,(contains也行)。定义两个集合,一个存储数组1中的元素,第二个存储最后相同的元素,当遍历nums2时,判断,如果set1.remove(num2中的元素)成立,则证明num2与num1中的元素相同,然后将这个元素添加进set2 中。
具体看代码:
第一种方法:
int [] nums1 = new int[]{4,9,5};
int [] nums2 = new int[]{9,4,9,8,4};
// 第一种方法,直接用双重for,将nums1与nums相等的元素放到集合中(防止重复),然后输出即可
Set<Integer> set = new HashSet <> ( );
for (int i = 0;i<nums1.length;i++){
for (int j = 0;j<nums2.length;j++){
if (nums1[i]==nums2[j]){
set.add ( nums1[i] );
}
}
}
int nums3[] = new int[set.size ()];
int n=0;
// 集合遍历赋值给数组
for (int num:set){
nums3[n]=num;
n++;
}
for (int num:nums3){
System.out.println(num);
}
执行结果:
执行用时:
第二种方法:
Set<Integer> set = new HashSet <> ( );
Set<Integer> set2 = new HashSet <> ( );
for (Integer num:nums1){
set.add ( num );
}
// 遍历nums2
for (Integer num:nums2){
// 在集合set一中,将数组2中的元素在集合一中若是存在(set.remove去除相同元素为真时),则将这个元素添加到集合2中(num2中的元素在集合set中时,也就是有相同元素)
if (set.remove ( num )){
set2.add ( num );
}
}
System.out.println(set2);
}
执行结果:
执行用时:
总结:这道题用到了set,是一种很好的结构,存储去重有很大的作用。
2019-3-11