寻找两个正序数组的中位数python,python两个有序数组合并成一个有序数组
Python找到两个有序数组的中间值
审题:找出意味着这是一个搜索算法问题,算法复杂度日志级别意味着提示你寻找二分搜索法。二分搜索法通常是递归实现的。
(1)递归包括递归体。
(2)终止条件思路:定理:有序数组中有一半的元素小于或等于数组的中值,有一半的元素大于或等于中值(如果数组中的元素个数是奇数,那么这里的一半严格来说不是1/2)。如果我们去掉一个数组中小于中值的k的个数,然后去掉另一个数组中大于中值的k的个数,合并后的子数组的中值就和原来的中值一样了。
例如:[1,2,3],[1,2,3]=[1,1,2,2,3,3]
根据定理,去掉元素[2,3],[1,2]=[1,2,2,3]的中值不变。我用一个特殊的例子来解释。你可以自己试试另一个。如果两个数组长度不一样,不能去掉一半,只能去掉相同的数。这里有一个详细的解决方案:假设两个数组的中位数是A [M1]和B [M2]
如果a[m1]==b[m2] [m2],那么刚好有一半的元素小于a[m1],那么a[m1]就是要求的中值。参考上栏if a[m1] b[m2],根据定理1,这个中值只能出现在a[n1/2 ~ n1-1]或b[0 ~ n2/2]中。也就是说,合并后的两个数组的中值与原数组的中值相同。根据定理2:
1.当数组长度相同时,去掉一半是合理的。
2.数组长度不同,所以中值可能会变化。解决方法是删除相同数量的元素。为什么?假设n1 n2,从两个数组中去掉n1/2个元素。那不是上面的范围(a[n1/2 ~ n1-1]或者b[0 ~ n2/2]),而是a[n1/2 ~ n1-1]或者b[0 ~ (-n1/2 n2-1)]。
结论是A的a[m1] b[m2]只有n1/2(四舍五入)可以删除。和上面的分析类似,中位数只能出现在A的前半段或者b的后半段,也就是说,a[0 ~ n1/2]和b[n1/2 ~ n2-1]的中位数和原来的中位数是一样的。参考:LeetCode参考答案
class Solution:def findMedianSortedArrays(self,nums1,nums2):“”:type nums1:List[int]:type num S2:List[int]:rtype:float m,n=len(nums1),len(nums2) if m n: nums1,num S2,m,n=nums2,num S1,n,m if n==0: raise ValueError imin,imax,half_len=0,m,(m n 1) //2 while imin=imax: 必须增大它imin=i 1 elif i 0和nums1[i-1] nums2[j]: # i太大,必须减小它imax=i - 1 else: # i完美if I==0:max _ of _ left=num S2[j-1]elif j==0:max _ of _ left=num S1[I-1]else:max _ of _ left=max(num S1[I-1],nums2[j-1]) if (m n) % 2==
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。