给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 提示: nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106 使用python解答
时间: 2023-11-29 18:06:48 浏览: 91
这道题可以使用二分查找的思路来解决。我们假设两个有序数组的长度分别为 m 和 n,中位数为第 k 小的数。那么我们可以先分别在两个数组中找出前 k/2 小的数,比较这两个数的大小,如果 nums1 的第 k/2 小的数小于 nums2 的第 k/2 小的数,那么说明中位数在 nums1 的第 k/2 小的数之后的部分和 nums2 的前 k/2 小的数之前的部分中,可以缩小搜索范围。反之,如果 nums1 的第 k/2 小的数大于 nums2 的第 k/2 小的数,那么说明中位数在 nums1 的前 k/2 小的数之前的部分和 nums2 的第 k/2 小的数之后的部分中。这样就可以不断缩小搜索范围,直到找到中位数或者搜索范围缩小到空集为止。
下面是 Python 代码实现:
```python
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
m, n = len(nums1), len(nums2)
if m > n: # 保证 nums1 的长度不大于 nums2 的长度
nums1, nums2, m, n = nums2, nums1, n, m
imin, imax, half_len = 0, m, (m + n + 1) // 2
while imin <= imax:
i = (imin + imax) // 2
j = half_len - i
if i < m and nums2[j-1] > nums1[i]:
# i 太小,需要增大
imin = i + 1
elif i > 0 and nums1[i-1] > nums2[j]:
# i 太大,需要减小
imax = i - 1
else:
# i 刚好合适,可以计算出中位数
if i == 0: max_of_left = nums2[j-1]
elif j == 0: max_of_left = nums1[i-1]
else: max_of_left = max(nums1[i-1], nums2[j-1])
if (m + n) % 2 == 1:
return max_of_left
if i == m: min_of_right = nums2[j]
elif j == n: min_of_right = nums1[i]
else: min_of_right = min(nums1[i], nums2[j])
return (max_of_left + min_of_right) / 2.0
```
阅读全文