为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第八天 数据结构和算法

集合

集合是什么?

  • 之前的栈、队列还有链表都是有序的,并且是可重复的;
  • 集合是无序且唯一的;
  • 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] 也是可通过的

思路:

  1. 利用Set集合进行去重,
  2. 遍历数组或者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)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消