两个数组的交集 II

187 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

  • 给你两个整数数组 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 <= nums1.length, nums2.length <= 1000
    • 0 <= nums1[i], nums2[i] <= 1000

二、思路分析:

  • 这个题目比两个数组的交集 I 多了一个需要输出重复项
  • 所以这题就不需要去重了,但是要考虑下重复项的个数,以最小的个数为准,比如:nums1=[1,2,2,2,3]nums2=[1,2,2,2,2,2,2,3],重复项相同数字有多个,以最少的为准,输出[1,2,2,2,3]
  • 遍历两个数组,如果出现第二个数组的项等于第二个数组的项,截取掉第二个数组的项,添加到定义好的变量中
    • splice方法改变原数组的长度,所以截取完后,遍历的参数值需要-1
    • 重复项需要一一对应,第一个数组中的项在第二个数组中找到一个相等值之后,就不需要再往后找了,所以需要添加break退出当前循环

三、AC 代码:

function intersect(nums1: number[], nums2: number[]): number[] {
    let resultArr: Array<number> = [];
    for(let i = 0; i < nums1.length; i++){
        for(let j = 0; j < nums2.length; j++){
            if(nums1[i] === nums2[j]){
                resultArr.push(nums2.splice(j, 1)[0]);
                j--
                break;
            }
        }
    }
    return resultArr
};难度

四、总结:

image.png