findKth(A,B,k)函数思路如下:
1. 保持A是短的那一个数组,B是长的
2. 平分k, 一半在A,一半在B (如果A的长度不足K/2,那就pa就指到最后一个)
3. 如果pa的值 < pb的值,那证明第K个数肯定不会出现在pa之前,递归,把A数组pa之前的砍掉,同理递归砍B数组。
4. 递归到 m == 0 (短的数组用完了) 就返回 B[k - 1], 或者k == 1(找第一个数)就返回min(A第一个数,B第一个数)。
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
lenA = len(nums1)
lenB = len(nums2)
#如果m+n为奇数,中间值为第(m+n)/2 + 1个元素
#如果m+n为偶数,中间值为第(m+n)/2和第(m+n)/2 + 1个元素的均值
if (lenA + lenB) % 2 == 1:
return self.getKth(nums1,nums2,(lenA + lenB)/2 + 1)
else:
return (self.getKth(nums1,nums2,(lenA + lenB)/2) + self.getKth(nums1,nums2,(lenA + lenB)/2 + 1)) * 0.5
def getKth(self,A,B,k): #前面的A是短的,后面的B是长的
lenA = len(A); lenB = len(B)
if lenA > lenB:
return self.getKth(B,A,k)
if lenA == 0:
return B[k - 1]
if k == 1:
return min(A[0],B[0])
pa = min(k/2,lenA); pb = k - pa
if A[pa - 1] <= B[pb - 1]:
return self.getKth(A[pa:], B, pb)
else:
return self.getKth(A, B[pb:], pa)