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

判断数组A元素是否均可匹配B中更大元素 求优于O(n²)的解法

更优解法:排序+双指针实现线性对数时间复杂度

绝对有更优的解法!你的O(n²)思路虽然直观,但当数组规模变大时效率会骤降。我们可以通过排序+双指针的组合,把时间复杂度降到O(n log n + m log m)(n是A的长度,m是B的长度),这在大数据量下会快很多。

核心思路

  1. 排序数组:先把A和B分别从小到大排序。排序的时间开销是整个算法的主要部分,但线性对数级的复杂度比平方级友好太多。
  2. 双指针匹配:用两个指针分别遍历排序后的A和B,尽可能给每个A的元素匹配最小的、比它大的B元素——这样能保留更大的B元素给A中更大的元素,最大化匹配成功的概率。
    • 如果当前B的元素大于A的元素:说明匹配成功,同时移动两个指针。
    • 如果当前B的元素小于等于A的元素:这个B元素没用,直接移动B的指针找更大的。
  3. 验证结果:如果A的所有元素都被匹配完(指针走到了A的末尾),就返回true;否则返回false。

示例演示

比如A = [2,3,1],B = [4,5,2]:

  • 排序后A变为[1,2,3],B变为[2,4,5]
  • 指针i(A的索引)初始为0,j(B的索引)初始为0:
    • B[j]=2 > A[i]=1 → 匹配成功,i=1,j=1
    • B[j]=4 > A[i]=2 → 匹配成功,i=2,j=2
    • B[j]=5 > A[i]=3 → 匹配成功,i=3(到达A末尾),循环结束,返回true

代码示例(Python)

def can_match(A, B):
    sorted_A = sorted(A)
    sorted_B = sorted(B)
    i = j = 0
    len_A, len_B = len(sorted_A), len(sorted_B)
    
    while i < len_A and j < len_B:
        if sorted_B[j] > sorted_A[i]:
            i += 1
            j += 1
        else:
            j += 1
    
    return i == len_A

复杂度分析

  • 排序阶段:O(n log n) + O(m log m)
  • 双指针遍历:O(n + m)
  • 整体时间复杂度:O(n log n + m log m),远优于O(n²),尤其是当数组长度超过几百时,性能差距会非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:20:48