美文网首页
Median of Two Sorted Arrays

Median of Two Sorted Arrays

作者: 斯文攸归 | 来源:发表于2020-07-01 12:58 被阅读0次
    class Solution:
        def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
            lenA = len(nums1)
            lenB = len(nums2)
            if (lenA + lenB) % 2 == 1: 
                #如果A+B的长度是奇数,则找A+B第int((lenA + lenB)/2) + 1大的数
                return self.getKth(nums1, nums2, int((lenA + lenB)/2) + 1)
            else:
                #如果A+B的长度是偶数,则找A+B第int((lenA + lenB)/2)大和int((lenA + lenB)/2)+1大的数,取均值
                return (self.getKth(nums1, nums2, int((lenA + lenB)/2)) + self.getKth(nums1, nums2, int((lenA + lenB)/2) + 1)) * 0.5
        def getKth(self, A, B, k):#寻找A+B中第K大的元素,假设len(A)<len(B)
            lenA = len(A); lenB = len(B)
            if lenA > lenB: 
                return self.getKth(B, A, k)
            if lenA == 0: #直接返回B中第k个元素
                return B[k - 1]
            if k == 1: #直接返回A+B中最小的元素
                return min(A[0], B[0])
            pa = min(int(k/2), lenA)
            #因为len(B)>len(A),所以取k/2和len(A)的较小者,目的是为了比较A和B的第pa个元素
            pb = k - pa
            if A[pa - 1] <= B[pb - 1]:
                #如果A的第pa-1个元素小于等于B的第pb-1个元素,则说明A的前pa个元素可以删掉了,A+B中第k大的元素一定在A[pa:]+B中,但是此时只需要找A[pa:]+B中第pb=k-pa大的元素了
                return self.getKth(A[pa:], B, pb)
            else:
                ##如果A的第pa-1个元素大于等于B的第pb-1个元素,同样说明B的前pb个元素可以删掉了,A+B中第k大的元素一定在A+B[pb:]中,但是此时只需要找A+B[pb:]中第pa=k-pb大的元素了
                return self.getKth(A, B[pb:], pa)
    

    相关文章

      网友评论

          本文标题:Median of Two Sorted Arrays

          本文链接:https://www.haomeiwen.com/subject/izpcqktx.html