Leetcode--寻找两个正序数组的中位数(解题思路+详细注释代码)Python实现

该博客详细介绍了如何在Python中解决LeetCode上的寻找两个正序数组中位数的问题。通过合并数组并排序,再根据数组长度的奇偶性确定中位数,提供了解题思路及带注释的完整代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2,请你找出并返回这两个正序数组的中位数。

示例如下:

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

已知题意:

两个数组合并的长度之和为奇数时,中位数只有一个。

例如:a =[2,4]  a1=[3]   中位数为3

两个数组的长度之和为偶数时,中位数是:位于中间的两个数的平均数

例如:b =[1,2]    c =[3,4]  中位数为2.5

解题思路:

1.将两个列表整合在一起。

2.对新的列表进行排序。

3.判断列表长度,如果长度是奇数,取中间数值,如果是偶数,取中间两个数值平均数。

代码如下:

class Solution:
    def lianggezhengxushuzudzhongweishu(self, shuzu1, shuzu2):
# 1. 数组1和数组2进行处理
        rongqiyuansu1 = len(shuzu1)
        rongqiyuansu2 = len(shuzu2)
# 判断一个数组为空,空的数组=数组2,中值/2后还是原来的结果(类似于: 3 * 2 / 2还是原来的结果)
        if rongqiyuansu1 == 0: shuzu1 = shuzu2
        elif rongqiyuansu2 == 0: shuzu2  = shuzu1
        if rongqiyuansu1 == 1 and rongqiyuansu2 == 1: return (shuzu1[0] + shuzu2[0]) / 2 # 这个情况直接返回
# 2. 获取基本变量信息
        zonggongrongqiyuansuzhihe = rongqiyuansu1 + rongqiyuansu2
        zhongweishu = int(zonggongrongqiyuansuzhihe / 2 + 1) # 运行到这里长度总>=3,zhongweishu中值的位置(3/2+1=2、4/2+1=3)
        suoyinyi = suoyiner = 0 # 便利索引
        cunchuliebiaodzhi = [0, 0] # 存储中值的列表
# 3. 核心代码
        while suoyinyi < rongqiyuansu1 and suoyiner < rongqiyuansu2:
# 假定两个数字长度相同,和一个数组遍历到临界点的时候,刚好suoyinyi + suoyiner == zhongweishu
            if shuzu1[suoyinyi] < shuzu2[suoyiner]:
                cunchuliebiaodzhi[(suoyinyi + suoyiner) % 2] = shuzu1[suoyinyi]
                suoyinyi += 1
            else:
                cunchuliebiaodzhi[(suoyinyi + suoyiner) % 2] = shuzu2[suoyiner]
                suoyiner += 1
            if suoyinyi + suoyiner == zhongweishu: break # 找到中位数,退出循环
# 对两个数组长度不一,以及一个数组下标suoyinyi或suoyiner先行达临界点(shuzu1.rongqiyuanzu1 = suoyinyi或shuzu2.rongqiyuanzu2 == suoyiner)进行补充
        while suoyinyi + suoyiner < zhongweishu and suoyinyi == rongqiyuansu1:
            cunchuliebiaodzhi[(suoyinyi + suoyiner) % 2] = rongqiyuansu2[suoyiner]
            suoyiner += 1
        while suoyinyi + suoyiner < zhongweishu and suoyinyi == rongqiyuansu2:
            cunchuliebiaodzhi[(suoyinyi + suoyiner) % 2] = shuzu1[suoyinyi]
            suoyinyi += 1
# 4. 判断后返回对应的运行结果
        if zonggongrongqiyuansuzhihe % 2 != 0:
            return cunchuliebiaodzhi[(suoyinyi + suoyiner - 1) % 2] # 总长度为奇数,中位数只有1个。
        else:
            return (cunchuliebiaodzhi[0] + cunchuliebiaodzhi[1]) / 2 # 总长度为偶数,中间的两个数的平均数。
#自己测一下
if __name__ == '__main__':
    s = Solution()
    result = s.lianggezhengxushuzudzhongweishu([1, 2], [3])
    print(result)
结果如下:
2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值