给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
// 方法一:利用filter() 自己想的,最好成绩76ms
var intersect = function(nums1, nums2) {
if(nums1.length > nums2.length)[nums1,nums2] = [nums2,nums1];//将nums1设成长度相对小的那个数组
let res = nums1;
res = res.filter(e => {
let index = nums2.indexOf(e);
return index !== -1 ? nums2[index] = 100 : false; //之前的解题都是把nums2[index]赋值为1的,但那是因为其他题原先是字母,而这题不是,所以我给定了一个相对大一点的值(100)或Infinity
});
// console.log(nums1);
// console.log(nums2);//直接将nums2的数组值给改了,如果不想改,一开始的时候弄一个let temp = nums2即可
return res;
};
// 方法二:利用哈希,84ms
var intersect = function(nums1, nums2) {
let hash = new Map();
let res = [];
for(let i = 0; i < nums1.length; i++){
if(hash.has(nums1[i])){
hash.set(nums1[i], hash.get(nums1[i]) + 1);
}else{
hash.set(nums1[i], 1);
}
}
for(let i = 0; i < nums2.length; i++){
if(hash.has(nums2[i])){
res.push(nums2[i]);
if(hash.get(nums2[i]) > 1){
hash.set(nums2[i], hash.get(nums2[i]) - 1);
}else{ //即hash.get(nums2[i])=1,在这个基础上减1就为0,0的话意味着没有该字母了,此处用delete实现
hash.delete(nums2[i]);
}
}
}
return res;
}
// 方法三:双指针 用时104ms 主要耗时在sort部分
var intersect = function(nums1, nums2) {
let p1 = 0;
let p2 = 0;
let res = [];
nums1 = nums1.sort((a,b) => a-b);//从小到大
nums2 = nums2.sort((a,b) => a-b);
// console.log(nums1);
while(p1 < nums1.length && p2 < nums2.length){
if(nums1[p1] === nums2[p2]){
res.push(nums1[p1]);
p1++;
p2++;
}else if(nums1[p1] > nums2[p2]){ //要注意这里o~
p2++;
}else{
p1++;
}
}
return res;
}
// 方法四:暴力破解 用时80ms
var intersect = function(nums1, nums2) {
const intersection = [];
for(let i = 0; i < nums1.length; i++){
let j = nums2.indexOf(nums1[i]);
if(j > -1){
intersection.push(nums2.splice(j,1));
}
}
return intersection;
}