给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <=1000
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
//nlog(n) 双指针
let res=new Set();//set中add添加重复元素 可以添加 不会有效果
let a = nums1.sort((a,b)=>a-b)
let b = nums2.sort((a,b)=>a-b)
let i=0, j=0
while(i<a.length && j<b.length){
if(a[i]<b[j]){
i++;
}else if(a[i]>b[j]){
j++;
}else{
res.add(a[i]);
i++;
j++;
}
}
return [...res]
//n^2
let res=new Set();
let a = nums1.sort((a,b)=>a-b)
let b = nums2.sort((a,b)=>a-b)
for(let i of a){
for(let j of b){
if(i === j){
res.add(i)
}
}
}
return [...res]
};
下面是关于new Map()和new Set()介绍对比
Map()
Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
下面是一些方法的例子
var m = new Map([['小明', 95], ['小张', 75], ['小王', 85]]);
m.get('小明'); // 95
var m = new Map(); // 空Map
m.set('小田', 20); // 添加新的key-value
m.set('小马', 28);
m.has('小田'); // 是否存在key '小田': true
m.get('小田'); // 20
m.delete('小田'); // 删除key '小田'
m.get('小田'); // undefined
//由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
var m = new Map();
m.set('小田', 20);
m.set('小田', 21);
m.get('小田'); // 21
set()
定义/演示
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
s.add(4);
s; // Set {1, 2, 3, 4}
s.add(4);
s; // 仍然是 Set {1, 2, 3, 4}
通过delete(key)方法可以删除元素:
var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}