题目要求给定两个从大到小排好序的数组,求解两个数组的中位数
如给定nums1=[1,2],nums2=[3].则所求中位数为2.又如nums1=[1,2],nums2=[3,4],则所求中位数为2.5.
所得Python代码为
class Solution: def FindMedia(self,nums1,nums2): if len(nums1)==0 or len(nums2)==0: newlist=nums1+nums2 length=len(newlist) if length%2==0: return (newlist[length/2]+newlist[length/2-1])/2 else: return newlist[(length+1)/2] else: postion=(len(nums2)+len(nums1))/2 i=0; j=0; max_first=0 max_second=0 while True: if i==len(nums1): newlist=nums1+nums2 length=len(newlist) if length%2==0: return (newlist[int(length/2)]+newlist[int(length/2-1)])/2 else: return newlist[int((length-1)/2)] elif j==len(nums2): newlist=nums2+nums1 length=len(newlist) if length%2==0: return (newlist[length/2]+newlist[length/2-1])/2 else: return newlist[(length+1)/2] elif nums1[i]>nums2[j]: if i+j+1>postion: max_second=max_first max_first=nums2[j] j+=1 elif nums2[j]>nums1[i]: if i+j+1>postion: max_second=max_first max_first=nums1[i] i+=1 if i+j>postion: break if (i+j)%2!=0: return (max_first+max_second)/2 else: return max_first a=Solution() nums1=[1,3,5] nums2=[6,8,10,11] print(a.FindMedia(nums1,nums2))
这种排序的思路是定义两个索引 i,j来寻找所求中位数,每次较小数的索引加1并将较小数赋给max_first变量,在通过合适的判断的索引大小判断来求出中位数。其中i=len(nums1)和j=len(nums2)是两种极端情况的判断,如nums1=[1,2,3],nums2=[4,5,6]和nums1=[4,5,6],nums2=[1,2,3].刚开始按照自己的想法敲代码的时候我是将较大值赋给max_first,结果程序运行结果出错,经反思发现这种思想存在漏洞,如数组nums1=[1,,3,5,9],nums2=[6,8,10,11],按照这种思路去排序的话,当进行完第三次判断之后i=3,max_first=6,当进行第四次判断的时候因为nums1[i]=nums1[3]=9>nums2[0],所以max_first=9,j=1所以求到的max_first=9,max_second=9.经此可知这种算法的核心在于若数组是从小到大排列则max_firsr取较小者,若是从大到小排列则max_first取较大者