1. 问题背景与核心挑战
在算法面试和实际工程问题中,处理有序数组的统计计算是高频考点。这道题要求在两个已排序的数组中找到合并后的中位数,看似简单实则暗藏多个技术难点。我曾在多个真实数据合并场景中遇到类似需求,比如合并来自不同数据源的排序日志时进行统计分析。
中位数的定义在偶数长度时取中间两数平均值,奇数时取中间数。但两个数组的合并操作如果真用O(m+n)时间合并再查找就太初级了。面试官期待的O(log(min(m,n)))解法需要更精妙的二分策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与性能瓶颈
最直观的解法是合并两个数组后直接取中位数:
python复制def findMedianSortedArrays(nums1, nums2):
merged = sorted(nums1 + nums2)
n = len(merged)
return (merged[n//2] + merged[(n-1)//2]) / 2
这种方法虽然代码简洁,但存在三个致命缺陷:
- 合并操作消耗O(m+n)额外空间
- 排序时间复杂度恶化到O((m+n)log(m+n))
- 完全没利用"数组已排序"的先决条件
在真实系统中,当处理GB级别的有序数据时,这种解法会立即导致内存溢出。我曾见过有人在生产环境这样写代码,最终引发整个服务崩溃。
3. 二分查找优化思路
高效解法的核心在于:中位数本质是第k小数的特例。对于合并后总长度为偶数的情况,就是找第k和k+1小的数取平均。关键在于如何在两个数组中协同进行二分查找。
具体步骤:
- 始终保持nums1为较短的数组(减少二分范围)
- 计算中位数的位置k = (m+n+1)//2
- 在nums1中试探位置i,则nums2对应位置j = k-i
- 比较nums1[i-1]与nums2[j]等临界值
python复制def findMedianSortedArrays(nums1, nums2):
if len(nums1) > len(nums2):
nums1, nums2 = nums2, nums1
m, n = len(nums1), len(nums2)
left, right = 0, m
