1. 问题背景与核心挑战
这道算法题源自真实面试场景,是考察候选人算法基础和编码能力的经典题目。给定两个已经按升序排列的数组nums1和nums2,要求找出这两个数组合并后的中位数。看似简单的问题背后隐藏着多个需要解决的子问题:
- 如何高效合并两个有序数组?
- 如何处理合并后数组长度为奇数和偶数的不同情况?
- 能否在不实际合并数组的情况下找到中位数?
我在第一次接触这个问题时,本能反应是先合并再取中位数。但实际编写时发现,这种暴力解法虽然直观,但当数组长度很大时(比如各100万元素),会消耗大量内存和时间。这促使我寻找更优解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与性能分析
2.1 直接合并法实现
最直观的解法是将两个数组合并后排序,然后根据长度奇偶性返回中位数:
python复制def findMedianSortedArrays(nums1, nums2):
merged = nums1 + nums2
merged.sort()
n = len(merged)
if n % 2 == 1:
return merged[n//2]
else:
return (merged[n//2-1] + merged[n//2])/2
注意:虽然题目说明输入数组已排序,但Python的+操作符不会保持顺序,所以需要显式调用sort()
2.2 时间复杂度分析
这种解法的时间复杂度主要来自排序操作。Python的sort()使用Timsort算法,平均时间复杂度为O((m+n)log(m+n)),其中m和n分别是两个数组的长度。空间复杂度为O(m+n),因为需要存储合并后的数组。
当处理小型数组时(如各100个元素),这种方法完全可行。但在实际工程场景中,面对大数据量时(如各10^6元素),这种解法会成为性能瓶颈。
3. 优化思路:二分查找法
3.1 算法核心思想
更高效的解法是利用数组已排序的特性,通过二分查找确定中位数的位置。基本思路是:
- 确保nums1是较短的数组(减少二分范围)
- 在nums1中寻找分割点i,nums2中对应分割点j=(m+n+1)//2 - i
- 检查分割线两侧元素的大小关系:
- num
