寻找两个正序数组的中位数-python

# 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 
#
#
#
# 示例 1:
#
#
# 输入:nums1 = [1,3], nums2 = [2]
# 输出:2.00000
# 解释:合并数组 = [1,2,3] ,中位数 2


方法:划分数组法,时间复杂度O(logmin(m,n))

def findMedianNum(nums1, nums2):
    """ 参考:https://blog.csdn.net/weixin_42721167/article/details/112637470
    :param nums1:
    :param nums2:
    :return:
    """
    m = len(nums1)
    n = len(nums2)
    MAX_NUM = 10 ** 6
    if m > n:
        return findMedianNum(nums2, nums1)
    if m == 0:
        return nums2[n // 2] if n % 2 == 1 else (nums2[n // 2 -1 ] + nums2[(n // 2)]) / 2
    if n == 0:
        return nums1[m // 2] if m % 2 == 1 else (nums1[m // 2 -1] + nums1[(m // 2)]) / 2
    left, right = 0, m  # 左右指针,寻找划分点
    median1, median2 = 0, 0  # 前后半部分中位数
    i, j = 0, 0  # nums1, nums2 划分点
    numsim1, numsi, numsjm1, numsj = 0, 0, 0, 0
    while left <= right:
        print(left)
        i = (left + right) // 2
        j = (m + n + 1) // 2 - i  # 要满足i+j是总长度的一半
        # 上下左右四个方位进行控制
        numsim1 = (nums1[i - 1] if i != 0 else -MAX_NUM)
        numsi = (nums1[i] if i != m else MAX_NUM)
        numsjm1 = (nums2[j - 1] if j != 0 else -MAX_NUM)
        numsj = (nums2[j] if j != n else MAX_NUM)
        if numsim1 <= numsj:
            median1, median2 = max(numsim1, numsjm1), min(numsi, numsj)
            left = i + 1
        else:
            right = i - 1
    return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

 

posted @ 2021-06-24 20:23  今夜无风  阅读(206)  评论(0编辑  收藏  举报