题目:两个数组的交集 II
leetcode链接:初级算法 - 两个数组的交集 II
说明:给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
理解:
1、有两个整数数组,以数组形式返回它们的交集(共有的元素)
2、如果某个元素在两个数组都出现了,但是出现的次数不一致,那么取出现次数较少的那个
3、可以不考虑交集中元素的顺序
思路:
1、使用map分别存储两个数组内各元素出现的次数,然后比较相同元素出现的个数,之后取较小的那个并完成数据的填充,最终返回填充后的数组即可。
2、数组和双指针,先对两个数组进行排序,然后利用双指针将相同的元素添加到数组并最终返回该数组即可
题解:
方案一、利用map
/**
* @param {number[]} list
* @return {obj}
*/
var getMap = function(list = []) {
var obj = {}
if (list.length) {
for(var i = 0; i < list.length; i++) {
if (!obj[list[i]]) {
obj[list[i]] = 1
} else {
obj[list[i]] += 1
}
}
}
return obj
}
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
var map1 = getMap(nums1)
var map2 = getMap(nums2)
var arr = []
for (let key in map1) {
if (map2[key]) {
if (map2[key] <= map1[key]) {
let list = new Array(map2[key])
list.fill(key)
arr.push(...list)
} else {
let list = new Array(map1[key])
list.fill(key)
arr.push(...list)
}
}
}
return arr
};
方案二、数组和双指针
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
nums1.sort((n1, n2) => n1 - n2)
nums2.sort((n1, n2) => n1 - n2)
var arr = []
let i = 0;
let j = 0;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
// 如果i指向的值小于j指向的值,,说明i指向
// 的值小了,i往后移一步
i++;
} else if (nums1[i] > nums2[j]) {
// 如果i指向的值大于j指向的值,说明j指向的值
// 小了,j往后移一步
j++;
} else {
// 如果i和j指向的值相同,说明这两个值是重复的,
// 把他加入到集合list中,然后i和j同时都往后移一步
arr.push(nums1[i]);
i++;
j++;
}
}
return arr
};
总结:
本篇主要实现了两个数组交集的两种解法,如果我们稍微留意会发现跟前面刷过的有些算法思路差不多,只是在实现方式上有所区别,我想这些沉淀来下的东西,会是我们宝贵的经验。