4. Median of Two Sorted Arrays
寻找两个 array 的 median,其实就是在两个 array 中找第 K 的大数 (K=(A.length + B.length) / 2
),对两个 sorted array 找 Kth,可以利用 merge sort 的思想来做binary search
:
由于是找第k大数(从1开始),使用二分法则需要比较A[k/2 - 1]和B[k/2 - 1],并思考这两个元素和第k大元素的关系。
A[k/2 - 1] <= B[k/2 - 1] => A和B合并后的第k大数中必包含A[0]~A[k/2 -1]
若 k/2 - 1 超出A的长度,则必取B[0]~B[k/2 - 1]
利用这一点来不停缩小 k 以及搜索区间,当k == 1
时就可以直接返回区间内首个元素。
其他就是考虑一些corner case。
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
len
len3 = len(nums1) + len(nums2)
if len3%2 != 0:
return self.findKth(nums1, 0, nums2, 0, len3//2+1)
else:
return (self.findKth(nums1, 0, nums2, 0, len3//2) + self.findKth(nums1, 0, nums2, 0, len3//2+1)) / 2
def findKth(self, A, startA, B, startB, k):
lenA, lenB = len(A), len(B)
if startA >= lenA:
return B[startB + k - 1]
if startB >= lenB:
return A[startA + k - 1]
if k == 1:
return min(A[startA], B[startB])
midA, midB = float("inf"), float("inf")
if startA + k//2 - 1 < lenA: midA = A[startA + k//2 - 1]
if startB + k//2 - 1 < lenB: midB = B[startB + k//2 - 1]
if midA > midB:
return self.findKth(A, startA, B, startB + k//2, k-k//2)
else:
return self.findKth(A, startA + k//2, B, startB, k-k//2)
Last updated
Was this helpful?