力扣数组排序之求中位数

题目要求给定两个从大到小排好序的数组,求解两个数组的中位数

如给定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取较大者

posted on 2019-07-18 15:03  之懿  阅读(668)  评论(0编辑  收藏  举报

导航