【Leetcode/解题报告】4. Median of Two Sorted Arrays

题目来源:

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



猜你喜欢

转载自blog.csdn.net/weixin_38196217/article/details/80119077
今日推荐