两个数组的交集

两个数组的交集

1.数组解法

创建一个数组存储出现过的数字,遍历两个数组,遇到值就 ++ 。

有重复的元素的值指向的值会 > 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
//求出数组中最大值
int max = nums1[nums1.length-1] > nums2[nums2.length-1] ? nums1[nums1.length-1] : nums2[nums2.length-1];
int[] res = new int[max+10];

for(int i : nums1){
if(res[i] == 0) //避免重复元素出现
res[i]++;
}

for(int i : nums2){
if(res[i] == 1){
res[i]++;
}
}
List<Integer> list = new ArrayList<Integer>();
for(int i = 0 ;i<res.length;i++){
if(res[i] == 2){
list.add(i);
}
}
int[] ans = new int[list.size()];
int index = 0;
for(Integer i : list){
ans[index++] = i;
}
return ans;
}
}

2. set解法

创建两个Set集合,先遍历第一个数组,将值 add 进去

紧接着,遍历第二个数组,利用Set的contains方法,在遍历第二个数组时,判断元素是否在第一个数组中出现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1.length ==0 || nums2.length == 0 || nums1 == null || nums2 == null)
return new int[0];

Set<Integer> set = new HashSet<Integer>();
Set<Integer> res = new HashSet<Integer>();

for(int i: nums1)
set.add(i);

for(int i : nums2){
if(set.contains(i))
res.add(i);
}

// Set 直接转 int数组
return res.stream().mapToInt(Integer::intValue).toArray();
}
}