求两个有序数组的中位数

题目

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)).

很容易想到是用分治来做,但是我自己在写代码的时候,讨论奇偶和最后终止时的边界实在是太烦了,写出来我自己都看不下去,肯定有更简单的办法。于是翻了翻大神们的答案,有下面这样一个解法。

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution(object):
def findMedianSortedArrays(self, A, B):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""

l = len(A) + len(B)
if l % 2 == 1:
return self.findKth(A, B, l//2)
else:
return (self.findKth(A, B, l//2-1) + self.findKth(A, B, l//2))/2.0


def findKth(self, A, B, k):
if len(A) > len(B):
A, B = B, A
if not A:
return B[k]
if k == len(A) + len(B) - 1:
return max(A[-1], B[-1])
i = len(A)//2
j = k-i
if A[i] > B[j]:
return self.findKth(A[:i], B[j:], i)
else:
return self.findKth(A[i:], B[:j], j)

不愧是大神,我怎么就没想到用findKth来简化奇偶性的讨论呢。但是这个findKth我又奇怪了,j = k - i 的时候,难道不怕数组越界?还真是不怕,注意到k的初始取值是总长度的一半,它总能让i和j在边界条件终止并退出递归。

然后这个递归条件的思路是这样的:

从运行时间上来说,每次递归丢掉了k个数,而k至少比A,B中较短的那个数组长度的一半要大,所以可以达到O(log(m+n))。