每日算法【数组】 - 两个数组的交集 II

59 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

好好学习,天天刷题~~

今日份刷题【两个数组的交集 II】记录如下:

题目描述

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

解法一

首先这是一道简单题,拿到手,第一反应就是暴力破解法。定义一个空数组total作为即将输出的数组备用,首先可以选择长度较小的数组作为第一层遍历循环,再遍历循环长度较长的那个数组,逐一比较,如果遇到相等的,就把这个值赋值给将要输出的数组total,在删除被比较的长数组的这一元素,就结束该轮比较。如果不相同,则继续比较,直至遍历结束。具体代码如下:

 var intersect = function(nums1, nums2) {
   var length1=nums1.length;
   var length2= nums2.length;
   var arr1=[];
   var arr2=[];
   if(length1>length2){
     arr1=nums2;
     arr2=nums1;
   }else{
     arr1=nums1;
     arr2=nums2;
   }
   var i=0;
   var total=[];
   while(i<arr1.length){
    var j=0;
    while(j<arr2.length){
      if(arr1[i]==arr2[j]){
        arr2.splice(j,1);
        total.push(arr1[i]);
        break;
      }else{
        j++;
      }
    }
   i++;
}
return total;
}

提交结果如下:

image.png

解法二

可以使用双指针法。

  • 定义两个双指针,两个指针均指向数组第一位。
  • 对数组进行排序
  • 逐一比较,如果相同就将该元素添加到要返回的数组中,如果不相同,则比较大小,较小的元素指针往前走。

具体代码如下:

var i1=0;
var i2=0;
nums1.sort((a,b)=>{
  return a-b;
})
nums2.sort((a,b)=>{
  return a-b;
})
var arr=[];
while(i1<nums1.length&&i2<nums2.length){
  if(nums1[i1]==nums2[i2]){
    arr.push(nums1[i1])
    i1++;
    i2++
  }
  else{
    nums1[i1]<nums2[i2]?i1++:i2++;
  }
}
return arr;
 };

提交结果如下:

image.png