Leetcode 4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 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)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5


思路:参考了 Yu's Coding Garden

http://yucoding.blogspot.com/2013/01/leetcode-question-50-median-of-two.html

首先,本题似乎隐藏了A,B中所有元素都不相同的条件。

令 N = m + n

(1)如果N odd ,那么median是第 N/2+1 个元素

(2)如果N even,那么median是第 N/2和N/2+1的平均值。

看到要求time complexity是O(log N),很明显的可以看出来是用binary search。参考给出的解法思路很巧妙。构造一个函数完成以下的目的:在A和B中去掉前K个元素。

假设 A = [1,3,5,7,9], B = [2, 4, 8, 10, 12, 14, 16, 18]。如果我们去掉前 K = (5+8)/2 = 6个元素,那么剩余的元素中最小的那个就是median。 

a = K/2 = 3

pb = K - pa = 3

           pa
A[1,3,5,7,9]
               pb
B[2, 4, 8, 10, 12, 14, 16, 18]

比较A[pa-1]和B[pa-1]的大小,如果 A[pa-1]<B[pa-1] 那么说明 A[0]到A[pa-1] 都在median之前。接下来,从A里面去掉三个元素, A = A[pa::]。

然后更新 K=K-pa。并重复以上的过程。

直到

(1)K = 1, 那么 A[0] B[0] 中比较小的那个就是第K个元素。

(2)如果一个array被清空,那么返回另外一个list的 index = K-1 的元素。

 

 1 class Solution(object):
 2     def findMedianSortedArrays(self, A, B):
 3         if (len(A) + len(B)) % 2 == 0:
 4             return (self.fms(A, B, (len(A) + len(B))/2) + self.fms(A, B, (len(A) + len(B))/2 + 1))/2.0
 5         else:
 6             return self.fms(A, B, (len(A) + len(B))/2 + 1)
 7      
 8     def fms(self, A, B, k):
 9         if len(A) > len(B):
10             return self.fms(B, A, k)
11         else:
12             if len(A) == 0:
13                 return B[k-1]
14             elif k == 1:
15                 return min(A[0], B[0])
16             else:
17                 pa = min(k/2, len(A))
18                 pb = k - pa
19                 if A[pa-1] < B[pb-1]:
20                     A = A[pa::]
21                     k -= pa
22                     return self.fms(A,B,k)
23                 else:
24                     B = B[pb::]
25                     k -= pb
26                     return self.fms(A,B,k)

 

posted @ 2017-02-25 14:57  lettuan  阅读(206)  评论(0编辑  收藏  举报