Median of Two Sorted Arrays

题目: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

转载于:https://www.cnblogs.com/ritchiewang/p/5767386.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值