给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
思路1:
利用集合实现,将num1的元素放入treeset(自动排序功能)中,如果这个元素是重复元素放入链表中,然后删除treeset中此元素以防重复。最后将链表数据放入数组。
代码1:
public class Intersection349 {
public int[] intersection(int[] nums1, int[] nums2) {
TreeSet<Integer> set = new TreeSet<>();
for (int num : nums1) {
set.add(num);
}
ArrayList<Integer> list = new ArrayList<>();
for (int num : nums2) {
if (set.contains(num)) {
list.add(num);
set.remove(num);
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
}
}
思路2:
获取num1的取值范围,使用boolean数组arr[]保存num1的值,避免排序。取出num2的元素与arr[]比较,不在范围的直接丢掉不考虑,继续删除相同的元素,即将arr[]对应位置值置为false,将相同的元素放入result[]中。
代码2:
public class Intersection349two {
public int[] intersection(int[] nums1, int[] nums2) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int num : nums1) {
if (num > max) {
max = num;
}
if (num < min) {
min = num;
}
}
boolean[] arr = new boolean[max - min + 1];
for (int num : nums1) {
arr[num - min] = true;
}
int size = 0;
int[] result = new int[max - min + 1];
for (int num : nums2) {
if (num >= min && num <= max && arr[num - min]) {
result[size++] = num;
arr[num - min] = false;
}
}
int[] finalResult = new int[size];
for (int m = 0; m < size; m++) {
finalResult[m] = result[m];
}
return finalResult;
}
}