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]
- 示例3
输入: nums1 = [3,1,3,1,0,7,9], nums2 = [1,3]
输出: [1,3]
解释: [3,1] 也是可通过的
思路分析
- 从题意知道,获取两个数组的交集,也就是要获取到两个数组共同存在的元素,若是共同存在的元素中在每个数组出现次数不一样,则取出现次数最少的那一组,但不需要考虑新数组里面元素的顺序。
- 首先将两个数组进行从小到大排序。
- 遍历两个数组,开始依次将两个数组的相同下标的值进行对比,若是值一致,就将这个值push到新的数组里;若是值不一致,也有两种情况,如果第一个数组的元素大于第二个数组的元素,由于是顺序是从小到大排的,那么后面的有可能相等,所以需要将index2加1,若是第一个数组的元素小于第二个数组的元素,则反之。最后得出num3就是两个数组的交集。
AC代码
let nums1 = [1,2,2,1]
let nums2 = [2,2]
function intersect(nums1, nums2) {
nums1.sort((x,y)=>{return x - y});
nums2.sort((x,y)=>{return x - y});
let index1 = 0;
let index2 = 0;
let nums3 = [];
while(index1 < nums1.length && index2 < nums2.length){
if(nums1[index1] == nums2[index2]){
nums3.push(nums1[index1]);
index1++;
index2++;
}else if(nums1[index1] > nums2[index2]){
index2++;
}else{
index1++;
}
}
return nums3;
};
console.log(intersect(nums1, nums2))
总结
这是一个简单的运算,主要考察数组的运算;复杂类型属于简单的;这道算法题还有很多种解法,这里只是给出了一个简单的解决方法(出自力扣)。