题意:给定两个大小分别为 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