寻找两个正序数组的中位数(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)

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WYKB_Mr_Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值