集合
集合是什么?
- 之前的栈、队列还有链表都是有序的,并且是可重复的;
- 集合是无序且唯一的;
- ES中使用Set来表示集合;
基本用法
集合的Set的使用:new, has,add,delete,size
const set = new Set() // Set(0) {size: 0}
set.add('a') // Set(1) {1}
set.size // 1
set.has('a') // true
set.delete('a') // true
数组去重
const arr = [1, 2, 2, 3, 3];
const newArr = [...new Set(arr)];
Set和Array的转换
// Array转换为Set
const arr = [1, 2];
const set = new Set(arr);
// Set转换为Array
const set = new Set();
const arr = [...set];
// 或者
const arr1 = Array.from(set)
Set迭代方法
const set = new Set([1, 2, 3])
for(let item of set) console.log(item)
for(let item of set.values()) console.log(item)
for(let item of set.keys()) console.log(item)
for(let [key, value] of set.entries()) console.log(key, value)
Set的交集
const set1 = new Set([1, 2, 3]);
const set2 = new Set([3, 4]);
const intersection = new Set([...set1].filter(item => set2.has(item)))
Set的差集
const set1 = new Set([1, 2, 3]);
const set2 = new Set([3, 4]);
const differenceSet = new Set([...set1].filter(item => !set2.has(item)))
具体示例
两个数组的交集(leetcode - 349)
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
思路:
- 利用Set集合进行去重,
- 遍历数组或者Set集合求出交集
// 方法1:先用数组求出交集,再用Set去重
var intersection = function(nums1, nums2) {
return [...new Set(nums1.filter(item => nums2.includes(item)))];
};
// 方法2:先用Set对其中一个数组去重,再用数组过滤
var intersection = function(nums1, nums2) {
return [...new Set(nums1)].filter(item => nums2.includes(item));
};
方法1和方法2的时间复杂度是O(mn),空间复杂度是O(m)
// 方法3:两个数组用集合来去重,然后遍历长度较小的集合
var addIntersection = function(set1, set2) {
if(set1.size > set2.size) {
addIntersection(set2, set1)
}
const set3 = new Set();
for(let key of set1) {
if(set2.has(key)) {
set3.add(key);
}
}
return [...set3]
}
var intersection = function(nums1, nums2) {
let set1 = new Set(nums1);
let set2 = new Set(nums2);
return addIntersection(set1, set2)
};
方法3的时间复杂度是O(m+n),空间复杂度是O(m+n)