您的位置:首页 > 其它

Median of Two Sorted Arrays

2015-12-11 13:03 363 查看
题目:https://leetcode.com/problems/median-of-two-sorted-arrays/

算法分析

这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个序列中,数值的大小处在(len(nums1)+len(nums2))/2位置的数。所以,这道题可以转换成,求解两个序列中,数值的大小处在第k位的数。这里用NkN_k表示要求的第k位数。

首先,我们分析两种简单的情况:

即两个序列中有一个序列为空,即len(nums1)==0len(nums1) == 0 or len(nums2)==0len(nums2) == 0,这时的返回值为非空序列的第k位数,即nums1[k-1]或者nums2[k-1]

对于比较一般的情况,我们需要先计算两个序列的元素总个数,total=len(nums1)+len(nums2)total=len(nums1)+len(nums2),然后,进行奇偶性分析:

1. 如果totaltotal为奇数,则Nmedian=Ntotal+12N_{median}=N_\frac {total+1} {2}

2. 如果totaltotal为偶数,则Nmedian=(Ntotal2+Ntotal2+1)/2N_{median}=(N_\frac {total} {2} + N_{\frac {total} {2}+1})/2

下面,就要对第k位数进行查找,这里的查找思路是利用二分查找:

每次查找,就需要对两个序列中的其中一个,去除k/2个数,所以,我们只需要比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小,如果前者大,就将Nums2中的前k/2个数去除,即第k位的数,一定不在Nums2的前k/2中。将Nums2的前k/2个数去除之后,问题就变成了从余下的元素中,寻找第k-k/2位数。

上述的查找思路,还需要考虑当Nums2的元素个数小于k/2时,就只能去除len(nums2)个数。即问题就变成了,在Nums1中寻找第k-len(nums2)位置的数。

在比较Nums1k/2Nums1_{k/2}和Nums2k/2Nums2_{k/2}的大小时,如果两者相等,则第k位置的数,就是Nums1k/2Nums1_{k/2}或Nums2k/2Nums2_{k/2}

代码实现

class Solution(object):
def findKth(self, a, m, b, n, k):
if m > n:
return self.findKth(b,n,a,m,k)
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 self.findKth(a[pa:], m-pa, b, n, k-pa)
elif a[pa-1] > b[pb-1]:
return self.findKth(a, m, b[pb:], n-pb, k-pb)
else:
return a[pa-1]

def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
m = len(nums1)
n = len(nums2)
total = m + n
if total & 1 == 1:
return self.findKth(nums1, m, nums2, n, total/2 + 1)
else:
return (self.findKth(nums1, m, nums2, n, total/2) + self.findKth(nums1, m, nums2, n, total/2+1))/2.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: