leetcode 两个数组的交集 II

44 阅读2分钟

给你两个整数数组 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]

解题1:哈希表

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
let intersect = function (nums1, nums2) {
  let map1 = makeMap(nums1)
  let map2 = makeMap(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++) {
        // 最小数量个元素 push 到结果数组
        res.push(num)
      }
    }
  }
  return res
}

function makeMap(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
}

解题2:首先对两个数组进行排序,然后使用两个指针遍历两个数组。

两个指针指向头部。每次比较指针指向的两个数字,相等,将该数字添加res,并将两个指针都右移一位,不相等,较小数字的指针右移一位,当至少有一个指针超出数组范围时,遍历结束。

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
let intersect = function (nums1, nums2) {
    nums1.sort((a,b)=>a-b)
    nums2.sort((a,b)=>a-b)

    const length1 = nums1.length
    const length2 = nums2.length

    let res = []
    let index1 = 0
    let index2 = 0

    while (index1 < length1 && index2 < length2) {
        if(nums1[index1] === nums2[index2]){
            res.push(nums1[index1])
            index1++;
            index2++;
        }else{
            nums1[index1] < nums2[index2]?index1++:index2++
        }
    }
    return res
}

链接:leetcode.cn/problems/in…

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。