python--lintcode65. 两个排序数组的中位数

描述

两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。

您在真实的面试中是否遇到过这个题?  

样例

给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5

给出数组A = [1,2,3] B = [4,5],中位数 3

挑战

时间复杂度为O(log n)

这一题挺难的,因为时间复杂度要求为O(log (m+n)),若是用之前合并排序数组的方法来做的话,时间复杂度应该为O(m+n),明显超时了。

那么怎么办呢,需要一个递归函数,每次能减少一半的查询规模。设K=(m+n)/2

那么方法就是对比A数组和B数组的第K/2个元素,谁小就把那个数组的前K//2个数直接砍了。递归执行。

OK这样说有点笼统了,直接看代码吧不懂的评论问:

class Solution:
    """
    @param A: An integer array.
    @param B: An integer array.
    @return: a double whose format is *.5 or *.0
    """

    def findMedianSortedArrays(self, A, B):
        n = len(A) + len(B)
        if n % 2 == 1:
            return self.findKth(A, B, n / 2 + 1)
        else:
            smaller = self.findKth(A, B, n / 2)
            bigger = self.findKth(A, B, n / 2 + 1)
            return (smaller + bigger) / 2.0

    def findKth(self, A, B, k):
        if len(A) == 0:
            return B[int(k - 1)]
        if len(B) == 0:
            return A[int(k - 1)]
        if k == 1:
            return min(A[0], B[0])

        a = A[int(k / 2) - 1] if len(A) >= k / 2 else None
        b = B[int(k / 2) - 1] if len(B) >= k / 2 else None

        if b is None or (a is not None and a < b):
            return self.findKth(A[int(k / 2):], B, int(k - k // 2))
        return self.findKth(A, B[int(k / 2):], int(k - k // 2))

s = Solution()
print(s.findMedianSortedArrays([1,2,3,4,5,6], [2,3,4,5]))

你可能感兴趣的:(python)