leetcode-350-Intersection of Two Arrays II(求两个数组的交集)
发布日期:2025-04-05 02:55:15 浏览次数:11 分类:精选文章

本文共 1309 字,大约阅读时间需要 4 分钟。

对于给定的两个数组nums1和nums2,我们需要找出它们的交集。交集中的每个元素出现的次数应该与它们在原数组中出现的次数相同,而结果的顺序不重要。

分析

  • 双重循环法:最直接的方法是使用双重循环,逐个比较每个元素,记录交集。这种方法的时间复杂度为O(n²),在数据量较大的情况下效率不佳。

  • 排序后双指针法:将两个数组排序后,使用双指针同时遍历两个数组,逐步比较元素,找到交集元素。这种方法的时间复杂度为O(n log n),显著优于双重循环法,适用于大多数情况。

  • 哈希表法:当其中一个数组远小于另一个数组时,使用哈希表来统计其中一个数组的元素频率,再遍历另一个数组,确认是否存在于哈希表中。这种情况下,时间复杂度为O(n + m),在大量数据情况下效率更高。

  • 但就在这时,假设两个数组已经被排序,双指针的方法就显得尤为高效,可以在O(n + m)的时间内完成任务。这种方法不仅优于双重循环,还能在不需要额外空间的情况下处理大量数据。

    优化策略

  • 数组已排序的情况

    • 使用双指针法已经是一个较为优化的方案,时间复杂度低于O(n²),适用于大部分情况。无需额外修改即可继续使用。
  • 数组大小的不平衡

    • 如果nums1的大小远小于nums2,可以考虑使用哈希表法,这样可以对nums2进行一次遍历,记录下来元素及其频率,然后只需遍历一次较小的nums1即可得到交集,时间复杂度提升到O(n + m)。
  • 磁盘存储的元素

    • 当nums2存储在磁盘上,无法一次性加载到内存时,可以采用分批处理的方法,类似于外部排序。这种方法在内存受限的情况下依然可行,但实现起来比较复杂。
  • 代码实现(C++)

    #include 
    #include
    using namespace std;vector
    intersect(vector
    & nums1, vector
    & nums2) { sort(nums1.begin(), nums1.end()); sort(nums2.begin(), nums2.end()); int s1 = nums1.size(), s2 = nums2.size(); int i = 0, j = 0; vector
    res; while (i < s1 && j < s2) { if (nums1[i] < nums2[j]) { i++; } else if (nums1[i] > nums2[j]) { j++; } else { res.push_back(nums1[i]); i++; j++; } } return res;}

    总结

    在处理两个数组交集的问题时,双指针法在排序后的数组中是比较高效的解决方案。对于大部分情况而言,这种方法能够在O(n log n)的时间复杂度内完成任务,仅在特别情况下,如数组大小的不平衡时,才需要考虑其他优化策略。

    上一篇:Leetcode-966 Vowel Spellchecker(元音拼写检查器)
    下一篇:LeetCode-32.最长有效括号

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月19日 05时17分06秒