YuArtian/blog

给定两个数组,求交集

YuArtian opened this issue · 0 comments

给定两个数组,求交集

条件如题

例如:给定 nums1 = [1, 2, 2, 1],nums2 = [2, 2],返回 [2, 2]

给定 nums1 = [1, 1, 1],nums2 = [1],返回 [1]

  1. 解法1:

    const intersect = (nums1, nums2) => {
      const map = {}
      const res = []
      for (let n of nums1) {
        if (map[n]) {
          map[n]++
        } else {
          map[n] = 1
        }
      }
      for (let n of nums2) {
        if (map[n] > 0) {
          res.push(n)
          map[n]--
        }
      }
      return res
    }
  2. 最优化解法

    var intersect = function (nums1, nums2) {
      const process = function (nums) {
        return nums.reduce((obj,key) => {
          if (key in obj) {
            obj[key] ++
          }else{
            obj[key] = 1
          }
          return obj
        },{})
      }
      var num1Map = process(nums1)
      var num2Map = process(nums2)
      var ret = []
      Object.keys(num1Map).forEach(key => {
        if (key in num1Map && key in num2Map) {
          ret.push(...Array(Math.min(num1Map[key], num2Map[key])).fill(key))
        }
      })
      return ret
    };