求两个排序数组的中位数来源:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/submissions/题目给定两个大小为m的排序数组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解题思路这里先了解一下中位数的概念:在统计学中,中位数是指将一组值分成上下两部分相等的能力,并且其中一部分的元素总是大于另一部分的元素。按照这个概念,我们现在把两个数组分开,num1数组用大写的A表示,num2数组用大写的B表示,写在这里只是为了方便。先划分A,在任意i处,把A分成两部分:在任意j处,也划分B:分别把A和B的两个数组的左边和右边按照中位数的概念组合起来,只要保证左边和右边的长度相等,左边的最大个数小于右边的最小个数,那么就可以求中位数,即满足上面两个公式,必须满足以下条件:只要满足上面的方程,就可以求出中位数。第一种情况,由于m+n之和的不确定性,单独分析:因为j的值为整数,所以最终会向下取整。但是这里要注意,因为j的值不能为负。因此,必须满足m<=n的前提,否则j可能小于0,程序运行时会出错。在这种情况下,意味着i的值太大,需要在增加j的值的同时减小i的值。以上就是不考虑边界的问题。先说考虑边界的情况:首先考虑i=0,或者j=0,也就是在数组最前面划分。此时左边部分j=0时,左边的最大值为A[i-1];当i=0时,最大值为B[j-1]。当i=m或j=n时,数组在最后被分割。当i=m时,右边的最小值是B[j],当j=n时,右边的最小值是A[i]以上是i为0或m的情况。j为0或n的情况。这里,当i变化时,j是否会越界可以忽略不计,推导如下:n=len(nums2)#这里必须始终满足m<=n的条件,以防止运行错误ifm>n:nums1,nums2,m,n=nums2,nums1,n,m#这里考虑的两个数组都是空状态,直接抛异常ifn==0:raiseValueError#只考虑i的值,j会相应变化,不会超过限制i_min,i_max,half_len=0,m,(m+n+1)//2whilei_min<=i_max:i=(i_min+i_max)//2j=half_len-iifi
