题目描述
给定两个数组,编写一个函数来计算它们的交集。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
题目思路
双集合
最直观的方法是迭代并检查第一个数组 nums1
中的每个值是否也存在于 nums2
中。如果存在,则将值添加到输出。 其中 n 和 m 分别为数组 nums1
和 nums2
的长度。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0;
while(i < nums1.length && j < nums2.length){
if(nums1[i] == nums2[j]){
set.add(nums1[i]);
i++;
j++;
}
else if(nums1[i]<nums2[j]){
i++;
}
else{
j++;
}
}
int [] arr = new int[set.size()];
int index = 0;
for (Integer integer : set) {
arr[index++] = integer.intValue();
}
return arr;
}
}
双指针
先将nums1 与nums2 排序,然后游走两个指针,情况都写出来了,没有用else
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0;
while(i < nums1.length && j < nums2.length){
if(nums1[i] == nums2[j]){
set.add(nums1[i]);
i++;
j++;
}
else if(nums1[i]<nums2[j]){
i++;
}
else{
j++;
}
}
int [] arr = new int[set.size()];
int index = 0;
for (Integer integer : set) {
arr[index++] = integer.intValue();
}
return arr;
}
}
内置retainAll方法
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set1 = new HashSet<>();
HashSet<Integer> set2 = new HashSet<>();
for (int i : nums1) {
set1.add(i);
}
for (int i : nums2) {
if (set1.contains(i)) {
set2.add(i);
}
}
set1.retainAll(set2);
int [] output = new int[set1.size()];
int idx = 0;
for (int s : set1) output[idx++] = s;
return output;
}