题目来自leetcode
https://oj.leetcode.com/problems/median-of-two-sorted-arrays/
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)).
class Solution:
# @return a float
def findMedianSortedArrays(self, A, B):
lenB = len(B)
lenA = len(A)
if (lenA > lenB):
return self.findMedianSortedArrays(B, A)
#中位点
k = int((lenA + lenB - 1)/2)
#左端
l = int(0)
#右端
r = min(k, lenA)
while l < r:
midA = int((l + r)/2)
midB = int(k - midA)
if (A[midA] < B[midB]):
l = midA + 1
else:
r = midA
choose1 = max(A[l-1], B[k - l]) if (l > 0) else B[k - l]
if (lenA + lenB)&1 == 1:
return choose1
if (lenA <= l):
choose2 = B[k - l + 1]
elif (k - l + 1) >= lenB:
choose2 = A[l]
else:
choose2 = min(A[l], B[k - l + 1])
return float(choose1 + choose2)/2
说明:
这一题的难度是Hard。我花了不少时间。最终的解决思路是通过二分法。
这里是判断长度。为了编程的复杂度,总是使A为短的一方。(因为后续代码操作的基准是A)
if (lenA > lenB):
return self.findMedianSortedArrays(B, A)
这里k选取两个list长度之和的中间位置。因为B为较长的list,所以后续B从此处开始比较。
l,r是A的两个比较端点。
#中位点
k = int((lenA + lenB - 1)/2)
#左端
l = int(0)
#右端
r = min(k, lenA)
下面开始比较,基本是二分法的思路,根据比较结果分别移动l和r。应该比较简单了。
while l < r:
midA = int((l + r)/2)
midB = int(k - midA)
if (A[midA] < B[midB]):
l = midA + 1
else:
r = midA
最后,当循环结束,我们得到以A[l] 和B[k - l]为边界的两组数据(左边的小,右边的大)。
如果两个数组总长度为奇数,选择choose1;否则选择choose1和choose2 平均的结果。
choose1 = max(A[l-1], B[k - l]) if (l > 0) else B[k - l]
if (lenA + lenB)&1 == 1:
return choose1
if (lenA <= l):
choose2 = B[k - l + 1]
elif (k - l + 1) >= lenB:
choose2 = A[l]
else:
choose2 = min(A[l], B[k - l + 1])
return float(choose1 + choose2)/2