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

leecode题目----寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5


def findmidnumber(nums1, nums2):
    """
    求出两个正序数组的中位数
    这里主要用到了二路归并排序算法
    :param nums1: 有序的数组,如[1,2,3]
    :param nums2: 有序的数组,如[3,4,5]
    :return: 两个正序数组的中位数,例如:3
    """
    len_left = len(nums1)
    len_right = len(nums2)
    left_point, right_point = 0, 0         # left_point是nums1的下标,right_point是nums2的下标,从零开始
    cover_num = []                         # 合并后的列表

    while left_point < len_left and right_point < len_right:   # 根据数组下标与数组长度的关系判断是否继续执行
        if nums1[left_point] <= nums2[right_point]:            # 如果nums1的数较小,就先放nums1
            cover_num.append(nums1[left_point])
            left_point = left_point+1
        else:
            cover_num.append(nums2[right_point])               # 如果nums2的数较小,就放nums2
            right_point = right_point+1

    cover_num = cover_num+nums1[left_point:]
    cover_num = cover_num+nums2[right_point:]                  # 把剩余没有走到头的数组添加到新的列表中

    len_all = len_left+len_right
    if len_all <= 1:                                           # 如果列表为空或者只有一个,则直接取这个数作为中位数
        middle_num = cover_num[0]
    elif len_all % 2 == 0:
        middle_num = (cover_num[int(len_all//2)]+cover_num[int(len_all//2)-1])/2  # 如果列表为偶数,取中间两个数的平均值
    else:
        middle_num = cover_num[int(len_all // 2)]                                 # 如果列表为奇数,直接取中间数作为中位数

    return middle_num


result = findmidnumber([1, 3], [2, 7])
print(result)

这里主要用到了二路归并排序算法,两个数组都是排序好的,因此只需要针对下标进行数组按大小合并即可。

日常学习记录,一起交流讨论吧!侵权联系~

Acho que você gosta

Origin blog.csdn.net/WYKB_Mr_Q/article/details/123061695
Recomendado
Clasificación