题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
这个是我自己一开始写出来的算法,有一点繁琐,但是理解并不困,使用了排序以及链表
public int[] intersect(int[] nums1, int[] nums2) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> nums2list = new ArrayList<>();
//先将它们各自进行升序排序
Arrays.sort(nums1);
Arrays.sort(nums2);
//排除掉一定没有交集的情况,需要考虑到数组为空时数组下标越界异常
if(nums1.length==0 || nums2.length==0)
return new int[0];
else if(nums1[nums1.length-1]<nums2[0] || nums1[0]>nums2[nums2.length-1]){
return new int[0];
}
//接下来是需要正常比较的情况
for (int m : nums2) {
nums2list.add(m);
}
//nums2list.forEach(System.out::println);
for (int i : nums1) {
for (Integer j : nums2list) {
if(i==j){
list.add(i);
nums2list.remove(j);//删除之后就找不到下一个了
break;
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i]=list.get(i);
}
//测试用
for (int i : res) {
System.out.println(i);
}
return res;
}
然后我在力扣评论区卡拿到有位大佬总结出来好几种
class Solution {
/**
* 使用集合实现
*/
public int[] intersect_1(int[] nums1, int[] nums2) {
List<Integer> list1 = new ArrayList<>();
for (int num : nums1) {
list1.add(num);
}
List<Integer> list2 = new ArrayList<>();
for (int num : nums2) {
if (list1.contains(num)) {
list2.add(num);
// 从 list1 除去已匹配的数值
list1.remove(Integer.valueOf(num));
}
}
int[] res = new int[list2.size()];
int i = 0;
for (int num : list2) {
res[i++] = num;
}
return res;
}
/**
* 使用集合的实现
*/
public int[] intersect_2(int[] nums1, int[] nums2) {
List<Integer> list1 = Arrays.stream(nums1)
.boxed()
.collect(Collectors.toList());
List<Integer> list2 = Arrays.stream(nums2)
.boxed()
.filter(num -> {
if (list1.contains(num)) {
list1.remove(num);
return true;
}
return false;
})
.collect(Collectors.toList());
int[] res = new int[list2.size()];
for (int i = 0; i < list2.size(); i++) {
res[i] = list2.get(i);
}
return res;
}
/**
* 使用映射实现
*/
public int[] intersect_3(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>(nums1.length);
// 将 nums1 出现的数值及频次放入映射中
for (int num : nums1) {
Integer count = map.get(num);
if (count == null) {
map.put(num, 1);
} else {
map.put(num, ++count);
}
}
List<Integer> list = new ArrayList<>();
for (int num : nums2) {
// 获取映射中该数值出现的频次
Integer count = map.get(num);
if (count != null && count != 0) {
list.add(num);
// 注意每次匹配后,该数值的频次需要减 1(nums1 和 nums2 匹配的数值的频次要相同)
map.put(num, --count);
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
/**
* 排序预处理
*/
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
List<Integer> list = new ArrayList<>();
for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ) {
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
list.add(nums1[i]);
i++;
j++;
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}