算法:1.给定两个数组,编写一个函数来计算它们的交集。[简单]

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:

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

var intersect = function(nums1, nums2) {
    var len1 = nums1.length;
    var len2 = nums2.length;
    var shortArr = nums2
    var longArr = nums1
    if (len1 < len2) {
        shortArr = nums1 
        longArr = nums2
    }
    var arr = []
    for (let i=shortArr.length - 1; i>=0; i--) {
        var num = shortArr[i]
        let index = longArr.indexOf(num)
        if (index != -1) {
            arr.push(num)
            longArr[index] = undefined
        }
    }
    return arr
};

运行结果:

算法:1.给定两个数组,编写一个函数来计算它们的交集。[简单]_第1张图片

进阶:

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

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
let intersect = function (nums1, nums2) {
  let map1 = makeCountMap(nums1)
  let map2 = makeCountMap(nums2)
  let res = []
  for (let num of map1.keys()) {
    const count1 = map1.get(num)
    const count2 = map2.get(num)

    if (count2) {
      const pushCount = Math.min(count1, count2)
      for (let i = 0; i < pushCount; i++) {
        res.push(num)
      }
    }
  }
  return res
}

function makeCountMap(nums) {
  let map = new Map()
  for (let i = 0; i < nums.length; i++) {
    let num = nums[i]
    let count = map.get(num)
    if (count) {
      map.set(num, count + 1)
    } else {
      map.set(num, 1)
    }
  }
  return map
}

涉及知识点:ES6-Map

你可能感兴趣的:(算法,js)