两个数组的交集 II

题目描述

就是给两个数组,求出他们的交集。

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。

思路

  • 使用map 记录其中一个数组数值出现的次数。
  • 遍历另一个数组,判断当前数字是否在map中,是的话添加到结果集中,并且当前map[number] 的值减1, 不是的话,那代表不是交集
var intersect = function(nums1, nums2) {
    let result = [];
    let map = new Map();
    for(let i = 0; i < nums1.length; i++) {
        if(map.has(nums1[i])) {
            map.set(nums1[i], map.get(nums1[i]) + 1)
        } else {
            map.set(nums1[i], 1)
        }
    }
    for(let j = 0; j < nums2.length; j++ ) {
        // 判断当前数字是否在map 中,并且当前map的值是否大于0, 大于0的意思是:map 中还有 没有取交集的数
        if(map.has(nums2[j]) &&  map.get(nums2[j]) > 0 ) {
            result.push(nums2[j]);
            map.set(nums2[j], map.get(nums2[j]) - 1)
        } 
    }
    return result;
};

进阶

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

这里只给一个想法吧,既然数组已经排序好了, 那我们就使用双指针的方法去解决这个问题,一个数组一个指针,如果两个指针所指的数相等,那么两个指针向后移,不相等的话判断哪个数值比较大,小的那个向后移,如此类推