leetcode 350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
此题和前面一道题(leetcoce 349. 两个数组的交集)一样,用map来记录每个数字出现的次数,遍历第二个数组的时候,来每出现一次数字,value值就-1,直到变为0。
public int[] intersection(int[] nums1, int[] nums2) { if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) { return new int[0]; } int l1 = nums1.length; int l2 = nums2.length; int[] a; int[] b; if (l1 > l2) { l1 = l2; a = nums2; b = nums1; } else { a = nums1; b = nums2; } int size = (l1 << 1) <= 0 ? Integer.MAX_VALUE : (l1 << 1); int[] arr = new int[l1]; Map<Integer, Integer> map = new HashMap<>(size); for (int key : a) { Integer integer = map.get(key); if (integer == null) { map.put(key, 1); } else { map.put(key, integer + 1); } } int i = 0; for (int key : b) { Integer integer = map.get(key); if (integer != null && integer != 0) { arr[i++] = key; map.put(key, integer - 1); } } if (i == 0) { return new int[0]; } return Arrays.copyOfRange(arr, 0, i); }
事件复杂度和空间复杂度都是中等。