1. 问题背景与核心挑战
这道来自力扣热题100的经典算法题,要求我们在两个已排序的数组中找到合并后的中位数。看似简单的需求背后隐藏着几个关键难点:首先,题目要求时间复杂度必须控制在O(log(m+n)),这意味着暴力合并的O(m+n)解法直接被判出局;其次,两个数组的长度可能差异巨大,需要考虑各种边界情况;最重要的是,如何在有序数组中实现对数级查找,这正是二分查找算法发挥威力的舞台。
我在第一次接触这个问题时,尝试了直接合并后取中位数的朴素解法,结果在提交时毫不意外地收到了超时警告。这促使我深入研究了二分查找在这个场景下的精妙应用。经过多次调试和优化,最终实现了一个既高效又健壮的解决方案。下面我将分享这个过程中的关键思路和实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路解析
2.1 中位数的数学本质
理解中位数的数学定义是解决这个问题的第一步。对于合并后的数组,当总长度为奇数时,中位数就是中间那个数;当长度为偶数时,则是中间两个数的平均值。这个定义看似简单,但转化为算法实现时需要特别注意:
- 无论总长度奇偶,中位数都可以看作是第k小的数(或两个数的平均值)
- 对于长度为m和n的两个数组,k的取值可能是(m+n+1)/2和(m+n+2)/2(兼容奇偶情况)
- 这意味着问题可以转化为在两个有序数组中寻找第k小的元素
2.2 二分查找的变种应用
传统的二分查找是在单个有序数组中进行的,而这个问题的创新点在于如何在两个数组间协同进行二分查找。核心思路是:
- 每次比较两个数组的第k/2个元素
- 较小值所在的数组前k/2个元素可以安全排除
- 递归查找剩下的元素中第k-k/2小的数
这个过程中有几个关键细节需要注意:
- 当某个数组长度不足k/2时,需要特殊处理
- 边界条件(如一个数组完全被排除)需要单独考虑
- 递归终止条件要精确控制
提示:在实际编码时,建议使用迭代而非递归实现,可以避免栈溢出并提升性能。
3. 详细实现步骤
3.1 基础框架搭建
首先我们定义函数签名和基础结构:
python复制def findMedianSortedArrays(nums1, nums2):
m, n = len(nums1), len(nums2)
# 统一处理奇偶情况
left = (
