Problem:
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)).
MyCode:
class Solution:
# @return a float
def findMedianSortedArrays(self, A, B):
m = len(A); n = len(B)
if m == 0 or n == 0:
if n == 0:
B = A; n = m
if n % 2 == 1:
return B[n/2]
else:
return (B[n/2] + B[n/2-1])/2.0
mn = m + n;
if mn % 2 == 1:
return float(self.KthNum(A, B, mn / 2 + 1))
else:
return (self.KthNum(A, B, mn / 2 + 1) + self.KthNum(A, B, mn / 2)) / 2.0
def KthNum(self, A, B, k):
m = len(A); n = len(B)
l = 0; r = min(m, k) - 1
B.append(1000000000); B.append(-1000000000)
while l <= r:
mid = l + (r - l) / 2
bk = k - (mid + 1) - 1
#print l, r, A[l], A[r], m, bk, A[m], B[bk], B[bk+1]
#print A[mid], mid, bk, n, l, r
if bk >= n:
l = mid + 1
else:
if A[mid] >= B[bk] and A[mid] <= B[bk+1]:
B.pop(); B.pop()
return A[mid]
if A[mid] > B[bk+1]:
r = mid - 1
elif A[mid] < B[bk]:
l = mid + 1
B.pop(); B.pop()
return self.KthNum(B, A, k)
if __name__=='__main__':
print Solution().findMedianSortedArrays([1,2], [1, 2, 3])
参考: http://blog.csdn.net/yutianzuijin/article/details/11499917/
Code:
class Solution:
# @return a float
def findMedianSortedArrays(self, A, B):
def findKthNum(a, b, k):
if len(a) > len(b):
return findKthNum(b, a, k)
m = len(a); n = len(b)
if m == 0:
return b[k-1]
if k == 1:
return min(a[0], b[0])
pa = min(k/2, m); pb = k - pa
if a[pa-1] == b[pb-1]:
return a[pa-1]
elif a[pa-1] > b[pb-1]:
return findKthNum(a, b[pb:], k-pb)
else:
return findKthNum(a[pa:], b, k-pa)
mn = len(A) + len(B)
if mn % 2 == 1:
return float(findKthNum(A, B, mn / 2 + 1))
else:
return (findKthNum(A, B, mn / 2) + findKthNum(A, B, mn / 2 + 1)) / 2.0
if __name__=='__main__':
print Solution().findMedianSortedArrays([4,5], [1,2,3,6])