这道题在leetcode的链接是leetcode。
中位数涉及奇偶问题,根据两个数组长度和是偶数还是奇数,中位数的计算方式是不同的。 遇到这种奇偶问题时,最直接的思维方式是统一奇偶的求解方法。 这里统一的方法就是将问题泛化为寻找第K大的数。
常见的二分查找,是在目标序列中进行折半。这里是将第K大中的K进行折半,然后比较两个数组相应位置元素的大小,然后排除掉K/2个元素。同时调整两个数组和寻找目标K。 相当于小步快跑。
有三个,一个是数组1到头了,直接从数组2返回相应的元素,另一个是数组2到头了,直接从数组1返回相应的元素,第三个是k变为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