给定两个数组,计算数组交集。
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
示例
输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]
方法 模拟哈希
思路
遍历第一个数组,将第一个数组的值、该值出现的次数,以(key:value)的形式存储下来,接着遍历第二个数组,判断是否在(key:value)中存在,存在则 value 减去 1,继续。
详解
定义模拟哈希的对象 hashObject、定义 result 数组存放最终符合条件的结果;
for 循环遍历第一个数组,将数组中每个值作为 key、出现次数作为 value 存到 hashObject 对象中,第一次出现 value 为 1,再次出现 value 加 1;
for 循环遍历第二个数组,判断第二个数组中每个值是否在 hashObject 中存在,即在 hashObject 作为 key 对应的 value 为 1 或者大于 1,如果存在将该值 push 到 result 数组中,并将该值对应的 value 减去 1;
返回 result 即可;
代码
const intersect = function (nums1, nums2) { const hashObject = {}; for (let i = 0; i < nums1.length; i++) { if (hashObject[nums1[i]]) { hashObject[nums1[i]] += 1; } else { hashObject[nums1[i]] = 1; } } const result = []; for (let j = 0; j < nums2.length; j++) { if (hashObject[nums2[j]]) { result.push(nums2[j]); hashObject[nums2[j]] -= 1; } } return result;};
复杂度分析
时间复杂度:O(n)。分别 for 循环遍历两个数组,每个耗费时间都是 O(n),总的时间复杂度 O(n)。
空间复杂度:O(n)。定义了一个 hashObject 对象存储第一个数组每个值、每个值出现的次数,空间大小最大为 O(n)、定义一个 result 数组存放最终符合条件的结果,空间大小最大为O(n),两者一起空间大小最大为 2n,所以空间复杂度为O(n)。
参考资料
《算法101》——政采云