题目来源:
https://leetcode.com/problems/median-of-two-sorted-arrays/description/
题意分析:
给定两个排好序的数组A, B,求它们的中位数。
题目思路:
将A分为A[:i - 1], A[i:],将B分为B[:j - 1], B[j:]。若A[:i - 1],B[:j - 1]中的所有数都小于等于另一边的所有数,且两边的数一样多,那中位数就是左边的最大数和右边最小数的平均值。要保证两边数一样多,即i + j = (len(A) + len(B))/2,换言之,i确定后,j就确定了。剩下的就是保证A[i - 1] < B[j]且A[i] > B[j - 1]。这样,我们就可以用二分搜索在A中找i的位置以满足以上条件。
以上仅为基本思想,实际代码中有大量细节需要考虑,如i = 0或i = len(A)的边界条件等。
class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ if len(nums1) > len(nums2): nums1, nums2 = nums2, nums1 if len(nums1) == 0: return nums2[len(nums2) // 2] if len(nums2) % 2 == 1 else (nums2[len(nums2) // 2 - 1] + nums2[len(nums2) // 2]) / 2 left, right = 0, len(nums1) while left <= right: i = (left + right) // 2 j = (len(nums1) + len(nums2)) // 2 - i if i < len(nums1) and nums1[i] < nums2[j - 1]: left = i + 1 elif i > 0 and nums1[i - 1] > nums2[j]: right = i else: break if i == len(nums1): min_of_right = nums2[j] elif j == len(nums2): min_of_right = nums1[i] else: min_of_right = nums1[i] if nums1[i] < nums2[j] else nums2[j] if (len(nums1) + len(nums2)) % 2 == 1: return min_of_right else: if i == 0: max_of_left = nums2[j - 1] elif j == 0: max_of_left = nums1[i - 1] else: max_of_left = nums1[i - 1] if nums1[i - 1] > nums2[j - 1] else nums2[j - 1] return (min_of_right + max_of_left) / 2