持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
提交结果如下:
解法二
可以使用双指针法。
- 定义两个双指针,两个指针均指向数组第一位。
- 对数组进行排序
- 逐一比较,如果相同就将该元素添加到要返回的数组中,如果不相同,则比较大小,较小的元素指针往前走。
具体代码如下:
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;
};
提交结果如下: