349. 两个数组的交集

https://leetcode.cn/problems/intersection-of-two-arrays/description/

思路

哈希表
方法1:用数组
方法2:用set

code

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        int hash[1001] = {0}; // 默认数值为0
        for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
            hash[num] = 1;
        }
        for (int num : nums2) { // nums2中出现话,result记录
            if (hash[num] == 1) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> res;
        unordered_set<int> nums_set(nums1.begin(),nums1.end());//去重
        for(int num:nums2){
            //发现num2的元素在 nums_set中出现过
            // set中的find函数,只要没有找到最后一个元素,说明在集合中出现了
            if(nums_set.find(num)!=nums_set.end()){
                res.insert(num);
            }
        }
        //类型转换
        return vector<int>(res.begin(),res.end());
    }
};
<think>好的,我现在需要帮助用户找到如何使用Lodash.js获取两个数组交集的例子。首先,我得回想一下Lodash库的相关方法。记得Lodash有一个名为_.intersection的函数,可以处理数组交集问题。但用户的具体需求可能是什么?他们可能想要基本用法,或者需要处理更复杂的情况,比如元素重复的情况。 接下来,我需要确认用户提供的引用内容。用户引用了几个LeetCode的问题和解决方案,比如349和350题,这两个题目分别处理数组交集的不同情况。349题要求唯一元素,而350题允许元素出现多次。但用户现在的问题是针对Lodash.js的,所以可能需要将LeetCode中的思路转换为Lodash的实现方式。 Lodash的_.intersection函数默认返回两个数组交集,但每个元素只出现一次,类似于LeetCode349题的结果。如果用户需要像350题那样保留重复元素,可能需要其他方法,比如计数每个元素出现的次数,并取最小值。但Lodash本身是否有这样的函数呢?或者需要结合其他方法来实现? 用户可能希望得到一个明确的例子,所以需要分步骤说明。首先,引入Lodash库,然后使用_.intersection函数。例如,数组arr1和arr2的交集就是_.intersection(arr1, arr2)。但要注意,结果中的元素是唯一的,不管原数组有多少重复。如果用户需要保留重复次数,可能需要自己处理,比如遍历交集元素,统计在两个数组中出现的次数,然后添加相应的数量。 另外,用户可能遇到的常见问题包括:如何处理多个数组交集?Lodash的_.intersection可以接受多个数组参数,返回所有数组交集。例如,三个数组交集就是_.intersection(arr1, arr2, arr3)。 还需要注意,Lodash的安装和引入方式。用户可能需要知道如何通过npm安装,或者在浏览器中引入CDN链接。例如,使用script标签引入Lodash库,或者在Node.js项目中通过require引入。 然后,我需要检查用户提供的引用内容中的代码示例,看看是否有可以借鉴的地方。例如,引用3和4中的C++代码使用了集合和哈希表来记录元素,以确保唯一性。而引用5中的Python代码使用了集合交集,然后计算每个元素的最小出现次数。如果用户需要类似LeetCode 350题的解决方案,可能需要结合Lodash的_.intersection和其他方法,比如过滤数组,统计次数。 但根据用户的问题,他们可能只需要基本的交集示例,所以首先展示_.intersection的基本用法,然后如果有更复杂的需求,再进一步说明如何处理。比如,如果需要保留重复元素,可以给出一个自定义函数的例子,使用Lodash的计数函数和循环来生成结果数组。 总结,回答应包括以下几点: 1. 引入Lodash库的方法。 2. _.intersection的基本使用示例。 3. 说明结果元素的唯一性。 4. 如何处理多个数组交集。 5. 如果需要保留重复元素,提供自定义解决方案的思路或代码。 同时,要确保回答结构清晰,步骤明确,并引用用户提供的参考资料中的相关信息。例如,引用[^5]中的方法使用了集合交集和最小次数,这可能对用户实现类似功能有帮助,但需要使用Lodash的函数来实现。</think>要使用 Lodash.js 获取两个数组交集,可以通过 `_.intersection` 方法实现。以下是分步说明和示例: --- ### 1. 基本用法 `_.intersection` 方法返回两个数组交集,且结果中的元素**唯一**(类似LeetCode 349题要求[^4]): ```javascript const _ = require('lodash'); // 引入Lodash const arr1 = [1, 2, 2, 3]; const arr2 = [2, 3, 4]; const result = _.intersection(arr1, arr2); console.log(result); // 输出: [2, 3] ``` --- ### 2. 多个数组交集 该方法支持传入多个数组参数,返回所有数组的共同元素: ```javascript const arr3 = [2, 3, 5]; const multiIntersection = _.intersection(arr1, arr2, arr3); console.log(multiIntersection); // 输出: [2, 3] ``` --- ### 3. 保留重复元素的交集(类似LeetCode 350题) 若需保留重复元素(如元素 `2` 出现两次),需自定义逻辑: 1. 先获取唯一交集; 2. 遍历交集元素,统计在两个数组中的最小出现次数; 3. 按次数填充结果数组。 ```javascript function intersectWithDuplicates(arr1, arr2) { const uniqueIntersection = _.intersection(arr1, arr2); const countMap = new Map(); // 统计arr1中元素的出现次数 arr1.forEach(num => { if (uniqueIntersection.includes(num)) { countMap.set(num, (countMap.get(num) || 0) + 1); } }); // 统计并取最小值 const result = []; uniqueIntersection.forEach(num => { const countInArr2 = arr2.filter(x => x === num).length; const minCount = Math.min(countMap.get(num), countInArr2); result.push(...Array(minCount).fill(num)); }); return result; } // 示例 console.log(intersectWithDuplicates([1,2,2,3], [2,2,3])); // 输出: [2,2,3] ``` --- ### 4. 引用说明 - `_.intersection` 的底层实现基于哈希表,时间复杂度为 $O(n)$[^3]; - 若需处理更复杂的数据结构(如对象数组),可结合 `_.intersectionWith` 使用自定义比较器[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值