1. 问题背景与核心挑战
在算法面试和实际工程中,处理有序数据的高效查询是一个经典问题。给定两个有序数组,如何快速找到它们合并后的中位数?这个问题看似简单,却蕴含着深刻的算法设计思想。
中位数的定义非常直观:
- 奇数个元素时:正中间的那个数
- 偶数个元素时:中间两个数的平均值
但问题的难点在于:
- 不能简单合并数组(违反O(log(m+n))的时间复杂度要求)
- 需要充分利用数组已排序的特性
- 要处理各种边界情况(空数组、重复元素、数组长度差异等)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法:合并数组法
2.1 算法实现
最直观的解法是合并两个有序数组,然后直接取中位数。这种方法使用双指针技术进行数组合并:
python复制def merge_and_find(nums1, nums2):
merged = []
i = j = 0
# 双指针合并
while i < len(nums1) and j < len(nums2):
if nums1[i] <= nums2[j]:
merged.append(nums1[i])
i += 1
else:
merged.append(nums2[j])
j += 1
# 处理剩余元素
merged.extend(nums1[i:])
merged.extend(nums2[j:])
# 计算中位数
n = len(merged)
if n % 2 == 1:
return float(merged[n//2])
else:
return (merged[n//2-1] + merged[n//2]) / 2.0
2.2 复杂度分析
- 时间复杂度:O(m+n) —— 需要遍历两个数组的所有元素
- 空间复杂度:O(m+n) —— 需要额外的合并数组存储空间
虽然这种方法简单易懂,但在处理大规模数据时效率不足,无法满足题目要求的对数时间复杂度。
