【Leetcode】349.两个数组的交集

349 两个数组的交集

题目:
给定两个数组,编写一个函数来计算它们的交集。

示例 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(1),而且set中不包含重复元素。因此考虑用Hashset数据结构来解决。
准备两个set,将nums1中元素加进set1中,将nums2中元素加进set2中。遍历set1中的元素,若其也在set2中,则将此元素加入到结果数组中。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums2 == null)
return null;
Set<Integer> set1 = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
for(int nums: nums1)
set1.add(nums);
for(int nums:nums2)
set2.add(nums);
List<Integer> list = new ArrayList<Integer>();
for(int num:set1){
if(set2.contains(num))
list.add(num);
}
int[] res = new int[list.size()];
for(int i = 0; i < list.size();i++)
res[i] = list.get(i);
return res;
}
}

list数据结构在定义时不需要声明大小。上述方法先将结果都加入到list中,再建立一个和list大小相同的数组,将list中的元素都加入到这个数组中,并返回。
注:list的添加操作为add,提取操作为get

也可以不用list,直接用数组来解决。

1
2
3
4
5
6
int [] res = new int[Math.max(set1.size(),set2.size())];
int idx = 0;
for (int num : set1){
if (set2.contains(num))
res[idx++] = num;
return Arrays.copyOf(res, idx);