判断数组A元素是否均可匹配B中更大元素 求优于O(n²)的解法
更优解法:排序+双指针实现线性对数时间复杂度
绝对有更优的解法!你的O(n²)思路虽然直观,但当数组规模变大时效率会骤降。我们可以通过排序+双指针的组合,把时间复杂度降到O(n log n + m log m)(n是A的长度,m是B的长度),这在大数据量下会快很多。
核心思路
- 排序数组:先把A和B分别从小到大排序。排序的时间开销是整个算法的主要部分,但线性对数级的复杂度比平方级友好太多。
- 双指针匹配:用两个指针分别遍历排序后的A和B,尽可能给每个A的元素匹配最小的、比它大的B元素——这样能保留更大的B元素给A中更大的元素,最大化匹配成功的概率。
- 如果当前B的元素大于A的元素:说明匹配成功,同时移动两个指针。
- 如果当前B的元素小于等于A的元素:这个B元素没用,直接移动B的指针找更大的。
- 验证结果:如果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
相关产品推荐
相关产品推荐

