Median of Two Sorted Arrays

Published: 31 Aug 2014 Category: 技术

题目

There are two sorted arrays A and B of size m and n respectively. Find 
the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

思路

把问题转化为在两个已经排序的数组中,查找第 k 个数的问题。这样,如果总数是奇数,则中位数为第 (la + lb) /2 + 1 个数。 如果总数是偶数,中位数为第 (la + lb) / 2 个数与第 (la + lb) / 2 + 1 个数的平均值。

class Solution:
    def _findk(self, A,  B, k):
        if len(A) > len(B): return self._findk(B, A, k)
        if len(A) == 0: return B[k-1]
        if k == 1: return min(A[0], B[0])

        ia = min(k / 2, len(A))
        ib = k - ia

        if A[ia - 1] == B[ib - 1]:
            return A[ia - 1]
        elif A[ia - 1] < B[ib - 1]:
            return self._findk(A[ia:], B, k-ia)
        else:
            return self._findk(A, B[ib:], k-ib)

    # @return a float
    def findMedianSortedArrays(self, A, B):
        total = len(A) + len(B)
        if total % 2 != 0:
            return self._findk(A, B, total / 2 + 1)
        else:
            return (self._findk(A, B, total / 2) 
                  + self._findk(A, B, total / 2 + 1)) / 2.0

注意几个地方,一是保证调用 _findk 时, A 的数目小于 B 的数目,这样有两个好处:

  • len(A) == 0 只用判断一次
  • ia - min(k / 2, len(A)) 与 b = k - ia 保证 A[ia-1], B[ib-1] 是有效的,否则 A 的数目很大, B 的数目很少,会导致 k 很大, ib 就会超出 B 的范围。