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)