给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。python
时间: 2025-03-07 18:04:05 浏览: 30
### 寻找两个有序数组的中位数
为了满足时间复杂度为 \(O(\log(m+n))\) 的要求,可以采用二分查找的方法来解决这个问题。这种方法通过不断缩小搜索范围,在每次迭代过程中排除掉不可能成为中位数的一部分元素。
#### 方法概述
假设 `nums1` 和 `nums2` 是两个已经排序好的数组,长度分别是 `m` 和 `n`。目标是在不实际合并这两个数组的情况下找到它们整体的中位数。核心思想是利用二分查找技术在一个较短的数组上操作,从而减少不必要的比较次数。
具体来说:
- 如果总长度 `(m + n)` 是奇数,则中位数就是第 \((m + n)/2 + 1\) 小的元素;
- 若为偶数,则需取中间两位数平均值作为最终结果。
下面给出具体的 Python 实现方式[^1]:
```python
def findMedianSortedArrays(nums1, nums2):
if len(nums1) > len(nums2): # Ensure A is not longer than B to reduce search space.
return findMedianSortedArrays(nums2, nums1)
x, y = len(nums1), len(nums2)
low, high = 0, x
while low <= high:
partitionX = (low + high) // 2
partitionY = ((x + y + 1) // 2) - partitionX
maxX = float('-inf') if partitionX == 0 else nums1[partitionX - 1]
minX = float('inf') if partitionX == x else nums1[partitionX]
maxY = float('-inf') if partitionY == 0 else nums2[partitionY - 1]
minY = float('inf') if partitionY == y else nums2[partitionY]
if maxX <= minY and maxY <= minX:
if (x + y) % 2 == 0:
return (max(maxX, maxY) + min(minX, minY)) / 2
else:
return max(maxX, maxY)
elif maxX > minY:
high = partitionX - 1
else:
low = partitionX + 1
raise ValueError("Input arrays are not sorted.")
```
此函数首先确保较小的那个数组被用来做二分查找的基础,这样可以在最坏情况下也只遍历一半的数据量。接着定义了四个变量分别表示划分后的最大最小边界值,并根据这些条件调整分区位置直到找到合适的分割点使得左边的最大值小于等于右边的最小值。最后根据不同情况计算并返回中位数值[^3]。
阅读全文
相关推荐


















