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)
这里主要用到了二路归并排序算法,两个数组都是排序好的,因此只需要针对下标进行数组按大小合并即可。
日常学习记录,一起交流讨论吧!侵权联系~