第六章-数据结构之集合
集合简介
- 集合是一种 无序且唯一 的数据结构
- ES6 中有集合,名为 Set
- 集合的常用操作:去重、判断某元素是否在集合中、求交集...
// 数组去重
const arr = [1, 2, 3, 3, 2, 1];
const set = [...new Set(arr)]
console.log(set); // [1,2,3]
// 判断集合中是否存在某个值
const set1 = new Set(arr);
// const has = set1.has(1); // true
const has = set1.has(5); // false
// 求集合交集
const set2 = new Set([2, 3]);
// filter 返回一个数组
const set3 = new Set([...set2].filter(item => set1.has(item)));
console.log(set3); // Set {2,3}
LeetCode 349 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
示例
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
【解题思路】
- 求交集且无需唯一
- 使用集合
【解题步骤】
- 用集合对 nums1 去重。
- 遍历 nums1,筛选出 nums2 也包含的值
【复杂度分析】
- 时间复杂度:O(m*n) --- filter 的复杂为 O(n)、includes 的复杂度为 O(m)
- 空间复杂度:O(m) --- 返回过滤后的交集数组
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
// 如果 nums2.includes(item) 为 true,那就将当前的 item 返回到一个数组中
return [...new Set(nums1.filter(item => nums2.includes(item)))]
};
filter()
方法 为数组中的每个元素调用一次 callback 函数,并利用所有使得" callback 返回 true 或 等价于 true 的值 的元素"创建一个新数组。
前端与集合:使用 ES6 中的 Set
-
ES6 提供了新的数据结构集合--Set,它的值是无序且唯一的。
-
Set 本身是一个构造函数,用来生成 Set 数据结构。
const set = new Set();
-
Set 函数可以接受一个数组作为参数,用来初始化。
const set = new Set([1,2,3]); // Set(3) {1, 2, 3}
实例方法
- add(value): 添加某个值,返回Set结构本身,可以链式添加
- delete(value): 删除某个值,返回一个布尔值,表示删除是否成功
- has(value): 返回一个布尔值,表示该值是否为Set的成员
- clear(): 清除所有的成员,没有返回值
const s = new Set();
s.add(1).add(2).add(3); // 向 set 结构中添加值, 返回 Set 本身
s.delete(2) // 删除 set 结构中的2值,删除成功返回 true
s.has(1) // 表示 set 结构中是否有1这个值 返回布尔值
s.clear() // 清除 set 结构中的所有值
//注意:删除的是元素的值,不是代表的索引
遍历
-
Set 结构的实例与数组是一样的,也拥有 forEach 方法,用于对每一个成员执行某种操作,没有返回值。
const set = new Set([1,2,3,4,5]) set.forEach(val => console.log(val)); // 1,2,3,4,5
-
for...of...
const set = new Set([1,2,3,4,5]) for (let item of set) { console.log(item); // 1,2,3,4,5 } for (let item of set.keys()) { console.log(item); // 1,2,3,4,5 } for (let item of set.values()) { console.log(item); // 1,2,3,4,5 } for (let (key, val) of set.entries) { console.log(key, val); // 1,1; 2,2; 3,3; 4,4; 5,5 }
Set 数据结构的键和值是一样的
数组和Set相互转换
// 将数组转为Set
const set = new Set([1,2,3])
// 将 Set 转为数组
const arr = [...set]
const arr1 = Array.from(set)
求交集/差集
const set1 = new Set([1,2,3]);
const set2 = new Set([3]);
// 交集 === [...set1].filter(item => set2.has(item)) 返回交集组成的数组
const interSection = new Set([...set1].filter(item => set2.has(item)))
// 差集 === !set2.has(item) 表示 set2 没有这一项则返回
const difference = new Set([...set1].filter(item => !set2.has(item)))