2020.06.26—27 周五、周六
4寻找两个正序数组的中位数
这道题目在我点进去之前我看着“困难”两个大字,心生怯惧。点进去之后看了一遍题目,不过如此。脑子里瞬间想到归并找中位数。然鹅!!!困难是真的困难!时间复杂度O(log(m+n))千万不要忽略!!
网上有很多帖子时间复杂度O(m+n)就好意思贴上去。
首先介绍中位数
的概念
一般我们理解的中位数是指一个有序数组里排在中间的数。
准确的定义是:选定一个数(不一定包含在数组里),让数组里大于和小于这个数的元素数量都不超过总元素数量的一半,这个数叫中位数。
比如:
1,2,3,4,5
的中位数是3 (可以理解为3在中间;也可以说小于3的数有两个,大于3的数有两个,都不超过总数5的一半)
1,2,3,3,3
的中位数是3 (可以理解为3在整个数组顺序上的中间)在这里会有疑问,小于3的数有两个可是大于3的数有零个。故实际操作定义如下:
总数为奇数,中位数就是有序序列下标在中间的那个数。
总数为偶数,中位数就是中间两个数的平均数。
——————————我是分割线——————————
题目:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
——————————我是分割线——————————
解法:
思路:首先说一下错误的解法,也是大部分人第一时间想到的解法——归并,然后找到中位数(总数为奇数个则找最中间的那个数;总数是偶数个则找中间的两个求平均值)。当然这种解法的代码我也会放出来,但是声明!这种解法是不符合题意的!
# 不符合时间按复杂度O(log(m+n))
def findMedianSortedArrays(nums1, nums2):
m = len(nums1)
n = len(nums2)
ls = []
i=0
j=0
while i<m and j<n: #一旦有一个数组遍历完毕则完毕
if nums1[i] < nums2[j]:
ls.append(nums1[i])
i = i + 1
else:
ls.append