每天一道算法题之寻找两个正序数组的中位数
题目链接
一、题目描述
给定两个大小分别为 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
三、题解
1.思路
1.将两个数组合并为一个数组。
2.查找合并后的数组的中位数。
2.解题过程
1.将两个数组中的元素进行比较,判断哪个数组中的元素较小,然后将较小的元素插入到新数组中,之后继续比较。
2.如果有数组中的元素没有插入完,则将这个较长的数组中剩下的元素都插入到新数组中。
3.查找新数组的中位数,如果新数组有奇数个数,则最中间的那个数即为中位数;如果新数组有偶数个数,则将中间的两个数求和再除以2。
3.复杂度
时间复杂度: O(m+n)
空间复杂度: O(m+n)
注:本题要求的时间复杂度为 O(log (m+n)),但是本解题方法却并未达到题目要求的时间复杂度。
如果要达到要求的时间复杂度,可以采用二分法求解。
# 四、代码展示
python
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
nums=[]
i,j=0,0
while i<len(nums1) and j<len(nums2):
if nums1[i]<=nums2[j]:
nums.append(nums1[i])
i+=1
else:
nums.append(nums2[j])
j+=1
while i<len(nums1):
nums.append(nums1[i])
i+=1
while j<len(nums2):
nums.append(nums2[j])
j+=1
n=len(nums)
if n % 2 == 1:
return float(nums[n//2])
else:
return(nums[n//2-1]+nums[n//2])/2.0