一、题目描述
给你两个整数数组 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]
二、思路
- 双指针解法:先将它们排序,再分别用一个指针逐一比较是否相同,相同就压入数组,两指针各进一步;不同的时候,数字小的前进一步(才能有机会得到数字大的元素与其相同)
- 数组解法:遍历nums1数组,逐一在nums2中indexof方法判断是否存在,存在就返回他的位置,并将该元素压入数组,同时删除nums2的元素
三、代码展示
// 双指针做法
let intersect = function (nums1, nums2) {
nums1.sort((a, b) => a - b); // 先排序
nums2.sort((a, b) => a - b);
let l = 0, r = 0, ans = [];
while (l < nums1.length && r < nums2.length) { // 不越界
if (nums1[l] === nums2[r]) {
ans.push(nums1[l]); // 相同的时候,两个指针同时移动一位 结果存起来
l++;
r++;
} else nums1[l] < nums2[r] ? l++ : r++; // 数字小的往右移, 不做push操作
}
return ans;
};
// 数组方法
let insert = function (nums1, nums2) {
let arr = [];
for(let i = 0; i < nums1.length; i++) {
let j = nums2.indexof(nums1[i]); // 逐一遍历nums1的元素,看看是否在nums2中 存在就返回他的位置
if(j >= 0) {
arr.push(nums1[i]) // 将存在的数存入数组
nums2.splice(j, 1); // 将已比较的重复元素删除
}
}
return arr;
}
四、回顾