350. 两个数组的交集 II
题目描述
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]解题方法
方法一:哈希表
- 思路:利用哈希表存储 nums1 中元素出现次数,再循环 nums2 ,若存在则 push 到结果,并且次数减 1
- 复杂度分析:
- 时间复杂度:O(m+n), m 是遍历 nums1, n 是遍历 nums2
- 空间复杂度:O(m+n), m 是哈希表大小,n 是 result 数组长度
提示:
- 1
<=nums1.length, nums2.length<=1000 - 0
<=nums1[i], nums2[i]<=1000
var intersect = function (nums1, nums2) { const map = {}; const res = []; if (nums1.length < nums2.length) { [nums1, nums2] = [nums2, nums1]; }
for (let i of nums1) { if (map[i]) { map[i] += 1; } else { map[i] = 1; } }
for (let i of nums2) { if (map[i] > 0) { res.push(i); map[i] -= 1; } } return res;};方法二:双指针
- 思路:设置两个指针分别指向两个已升序排序的数组头部,当两个指针指向元素一样时,加入结果,两个指针自增。否则比较两个元素,向右移动较小元素指针
- 复杂度分析:
- 时间复杂度:O(mlogm+nlogn), m、n 分别是数组的长度,排序时间复杂度是 O(mlogm+nlogn)
- 空间复杂度:空间复杂度 O(logm+logn)
var intersect = function (nums1, nums2) { nums1 = nums1.sort((a, b) => a - b); nums2 = nums2.sort((a, b) => a - b);
const res = [];
let i = 0; let j = 0; while (i < nums1.length && j < nums2.length) { if (nums1[i] < nums2[j]) { i += 1; } else if (nums1[i] > nums2[j]) { j += 1; } else { res.push(nums1[i]); i += 1; j += 1; } } return res;};