You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写时间复杂度O(n)的伪代码判断两数组是否有公共元素

优化数组公共元素判断至O(n)时间复杂度的方案

你当前的嵌套循环确实是O(n²)的时间复杂度,要优化到O(n)级别,最直接的方法是借助哈希集合,利用集合的O(1)查找特性。如果想基于排序实现,虽然时间达不到严格的O(n),但也是远优于O(n²)的优化方案,下面分别给出两种可行方案:

方案一:哈希集合法(时间O(n+m),空间O(n))

伪代码

function hasCommonElement(A, B):
    创建空哈希集合 set
    遍历数组A的每个元素element:
        将element加入set
    遍历数组B的每个元素element:
        若element存在于set中:
            返回true
    返回false

说明

  • 遍历A构建集合的时间为O(n)(n为A的长度),遍历B查找的时间为O(m)(m为B的长度),总时间复杂度为O(n+m),当n和m规模相近时等价于O(n)。
  • 空间复杂度取决于A的元素数量,为O(n),用于存储A的所有元素。

方案二:排序+双指针法(时间O(n log n + m log m),空间O(1)或O(n+m))

如果你想基于排序实现,核心逻辑是先对两个数组排序,再用双指针同步遍历,避免嵌套循环:

伪代码

function hasCommonElement(A, B):
    对数组A进行排序
    对数组B进行排序
    初始化指针i = 0, j = 0
    当i < A.length 且 j < B.length:
        若A[i] == B[j]:
            返回true
        否则若A[i] < B[j]:
            i += 1  // 移动A的指针,寻找更大的元素
        否则:
            j += 1  // 移动B的指针,寻找更大的元素
    返回false

说明

  • 排序阶段的时间为O(n log n + m log m),双指针遍历阶段为O(n+m),总时间复杂度为O(n log n + m log m),远低于O(n²)。空间开销取决于排序方式:若使用原地排序(如堆排序),空间复杂度为O(1);若使用非原地排序(如归并排序),空间复杂度为O(n+m)。

方案选择建议

  • 若追求极致时间效率、内存充足,优先选哈希集合法。
  • 若内存资源紧张,可选择排序+双指针法,以少量时间开销换取更低空间占用。

内容的提问来源于stack exchange,提问作者Ninaaaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:44:52