题目描述
给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。注意:列表中的整数可以按 任意 顺序返回。
解析
正常解法就是用两个set去存储然后相互找满足条件的元素,手动循环比使用removeAll快一点。
public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp1 = new ArrayList<>();
List<Integer> temp2 = new ArrayList<>();
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
for(int n : nums1) {
set1.add(n);
}
for(int n : nums2) {
set2.add(n);
}
for(int s : set1) {
if(!set2.contains(s)){
temp1.add(s);
}
}
res.add(temp1);
for(int s : set2) {
if(!set1.contains(s)){
temp2.add(s);
}
}
res.add(temp2);
return res;
}
然后就是巧妙的解法了,由于提示中有说明输入的-1000 <= nums1[i], nums2[i] <= 1000,且1 <= nums1.length, nums2.length <= 1000,那么说明nums中的元素最大值最小值之差最多2000,因此可以定义一个2000长度的数组来记录每个元素出现的次数。
public List<List<Integer>> findDifference(int[] nums1, int[] nums2) {
List<List<Integer>> resultList = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
int[] common = new int[2001];
for (int i : nums1) {
common[i + 1000] = 1;
}
for (int i : nums2) {
if (common[i + 1000] == 0) {
list2.add(i);
}
common[i + 1000]++;
}
for (int i : nums1) {
if (common[i + 1000] == 1) {
list1.add(i);
}
common[i + 1000]++;
}
resultList.add(list1);
resultList.add(list2);
return resultList;
}