题目描述
给你两个下标从 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;}