力扣349 == 两个数组交集的两种解法

目录

[解法一:利用 Set 特性高效去重](#解法一:利用 Set 特性高效去重)

[解法二:双重遍历与 Set 去重](#解法二:双重遍历与 Set 去重)

方法对比与总结

关键点总结


题目描述

给定两个整数数组 nums1nums2,要求返回它们的交集。输出结果中的每个元素必须是唯一的,且顺序不限。

示例

  • 输入:nums1 = [1,2,2,1], nums2 = [2,2]

    输出:[2]

  • 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]

    输出:[9,4][4,9]


解法一:利用 Set 特性高效去重

思路

  1. nums1 转换为 Set 结构,自动去重。

  2. 遍历 nums2,检查元素是否存在于 Set 中:

    • 若存在,则将该元素加入结果数组,并从 Set 中删除,避免后续重复匹配。
  3. 最终返回结果数组。

代码实现

复制代码
var intersection = function(nums1, nums2) {
    const st = new Set(nums1);
    const ans = [];
    for (const x of nums2) {
        if (st.delete(x)) { // 如果元素存在,删除并收集
            ans.push(x);
        }
    }
    return ans;
};

复杂度分析

  • 时间复杂度 :O(m + n),其中 mn 是数组长度。

    转换 nums1Set 需要 O(m),遍历 nums2 需要 O(n)。

  • 空间复杂度 :O(m),用于存储 Set

优势

  • 高效处理重复元素:通过 st.delete(x) 确保每个元素只匹配一次。

  • 线性时间复杂度,适合处理大数据量。


解法二:双重遍历与 Set 去重

思路

  1. 遍历 nums1,对每个元素检查是否存在于 nums2 中。

  2. 若存在,则将其加入 Set 自动去重。

  3. 最终将 Set 转为数组返回。

代码实现

复制代码
var intersection = function(nums1, nums2) {
    let set = new Set();
    for (let i = 0; i < nums1.length; i++) {
        if (nums2.includes(nums1[i])) {
            set.add(nums1[i]);
        }
    }
    return Array.from(set);
};

复杂度分析

  • 时间复杂度 :O(m × n),最坏情况下需遍历 nums2 的每个元素。

  • 空间复杂度 :O(k),k 为交集元素的数量。

缺点

  • nums2.includes() 的时间复杂度为 O(n),当数组较大时性能较差。

方法对比与总结

特性 解法一(Set + 删除) 解法二(双重遍历 + Set)
时间复杂度 O(m + n) O(m × n)
空间复杂度 O(m) O(k)
处理重复元素 立即删除,避免重复匹配 依赖 Set 去重
适用场景 大数据量 小数据量或简单场景

推荐解法

优先选择解法一 ,因为它利用 Set 的高效查找和删除操作,时间复杂度更低,尤其适合处理大规模数据。解法二虽然代码更直观,但性能较差,仅在数据量较小时适用。


关键点总结

  1. 去重机制 :使用 Set 结构天然去重。

  2. 性能优化:通过删除已匹配元素减少重复检查。

  3. 方法选择:根据数据规模选择时间复杂度更优的解法。

相关推荐
S01d13r1 小时前
LeetCode 解题思路 47(最长回文子串、最长公共子序列)
算法·leetcode·职场和发展
摄殓永恒2 小时前
【入门】数字走向II
算法
饮啦冰美式3 小时前
PPO近端策略优化算法
人工智能·深度学习·算法
void_sk3 小时前
C/C++复习--C语言中的函数详细
c语言·c++·算法
evolution_language3 小时前
LintCode第485题-生成给定大小的数组,第220题-冰雹猜想,第235题-分解质因数
数据结构·算法·新手必刷编程50题
钢铁男儿4 小时前
C# 方法(参数数组)
java·算法·c#
KuaCpp4 小时前
5.8线性动态规划2
算法·动态规划
How_doyou_do5 小时前
备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝
算法·深度优先
晴空闲雲6 小时前
线性表-顺序表(Sequential List)
数据结构·算法
Javis2116 小时前
代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
数据结构·c++·算法