leetcode链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/desc...

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        """
    找出两个已经排序的数组的中位数
    解法思路:二分查找
    中位数:找有序数组中间的数字,假设中位数是第k个数,即寻找第k个数,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1]
    每次取pivot1和pivot2中较小的那个,然后比较pivot1和pivot2的大小
    pivot1 > pivot2,说明nums1[0 .. k/2-1]都不可能是中位数,因为nums1[0 .. k/2-1]中的最大值都小于pivot2,所以可以排除nums1[0 .. k/2-1]
    pivot1 < pivot2,说明nums2[0 .. k/2-1]都不可能是中位数,因为nums2[0 .. k/2-1]中的最大值都小于pivot1,所以可以排除nums2[0 .. k/2-1]
    每次排除掉了一部分元素,所以从k中删除掉排除的元素个数
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: float
    """
        def getKNumber(k):
            index1 = index2 = 0
            while True:
                if index1 == len(nums1):     # 第k个数不可能在nums1数组当中
                    return nums2[index2 + k - 1]
                if index2 == len(nums2):
                    return nums1[index1 + k - 1]
                if k == 1:
                    return min(nums1[index1], nums2[index2])

                # 按照index1,index2为起点,不断通过二分查找更新,缩小范围
                newIndex1 = min(index1 + k // 2 - 1, len(nums1) - 1)
                newIndex2 = min(index2 + k // 2 - 1, len(nums2) - 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

        total_length = len(nums1) + len(nums2)
        if total_length % 2 == 1: # 如果为奇数个元素,取中间元素即可
            return getKNumber(total_length // 2 + 1)
        else:
            return getKNumber(total_length // 2) / 2 + getKNumber(total_length // 2 + 1) / 2

瘦瘦的牛排
1 声望0 粉丝

引用和评论

0 条评论