Median of Two Sorted Arrays

来源:互联网 发布:淘宝手表正品店 编辑:程序博客网 时间:2024/06/16 01:51

题目:https://leetcode.com/problems/median-of-two-sorted-arrays/

算法分析

这道题的目的,是为了从两个有序列中找到合并序列之后的中位数,即两个序列中,数值的大小处在(len(nums1)+len(nums2))/2位置的数。所以,这道题可以转换成,求解两个序列中,数值的大小处在第k位的数。这里用Nk表示要求的第k位数。
首先,我们分析两种简单的情况:
即两个序列中有一个序列为空,即len(nums1)==0 or len(nums2)==0,这时的返回值为非空序列的第k位数,即nums1[k-1]或者nums2[k-1]
对于比较一般的情况,我们需要先计算两个序列的元素总个数,total=len(nums1)+len(nums2),然后,进行奇偶性分析:
1. 如果total为奇数,则Nmedian=Ntotal+12
2. 如果total为偶数,则Nmedian=(Ntotal2+Ntotal2+1)/2
下面,就要对第k位数进行查找,这里的查找思路是利用二分查找:
每次查找,就需要对两个序列中的其中一个,去除k/2个数,所以,我们只需要比较Nums1k/2Nums2k/2的大小,如果前者大,就将Nums2中的前k/2个数去除,即第k位的数,一定不在Nums2的前k/2中。将Nums2的前k/2个数去除之后,问题就变成了从余下的元素中,寻找第k-k/2位数。
上述的查找思路,还需要考虑当Nums2的元素个数小于k/2时,就只能去除len(nums2)个数。即问题就变成了,在Nums1中寻找第k-len(nums2)位置的数。
在比较Nums1k/2Nums2k/2的大小时,如果两者相等,则第k位置的数,就是Nums1k/2Nums2k/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
0 0
原创粉丝点击