Leetcode04-寻找两个正序数组的中位数
题目
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
解析
首先,本题给出的数组是正序的,且要求时间复杂度为O(log (m+n)),那就得考虑采用二分法进行解答,如果不考虑二分法,可以考虑将两个数组进行拼接再排序,复杂度为O (m+n)。
对于二分法,考虑采用两个指针来操作,首先计算两个数组的长度之和,如果m+n为奇数,则中位数为(m+n+1)/2,我们需要采用二分法找到第(m+n)位,果m+n为奇数,则中位数为(m+n)/2,我们需要采用二分法找到第(m+n)位,中位数是两个有序数组中的第 (m+n)/2(m+n)/2 个元素和第 (m+n)/2+1(m+n)/2+1 个元素的平均值。因此,这道题可以转化成寻找两个有序数组中的第 k小的数,其中 k为 (m+n)/2 或 (m+n)/2+1。
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
def getKthElement(k):
index1, index2 = 0, 0
while True:
# 特殊情况
if index1 == m:
return nums2[index2 + k - 1]
if index2 == n:
return nums1[index1 + k - 1]
if k == 1:
return min(nums1[index1], nums2[index2])
# 正常情况
newIndex1 = min(index1 + k // 2 - 1, m - 1)
newIndex2 = min(index2 + k // 2 - 1, n - 1)
pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]
if pivot1 <= pivot2:
k -= newIndex1 - index1 + 1
index1 = newIndex1 + 1
else:
k -= newIndex2 - index2 + 1
index2 = newIndex2 + 1
m, n = len(nums1), len(nums2)
totalLength = m + n
if totalLength % 2 == 1:
return getKthElement((totalLength + 1) // 2)
else:
return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2 + 1)) / 2