leetcode 0004 寻找两个正序数组的中位数 python

寻找两个正序数组的中位数


一、思路

方法一:直接将两个数组合并(不去重),然后找出位置在中间的数即可(长度为奇数时只有一个,为偶数时,结果为中间两个数字的平均)
方法二:根据方法一可以知道,中位数,就是两个数组中第k小的数。我们可以设两个指针,在两个数组中去寻找第k小的数(k为总长度的一半)。利用二分法的思想,每次排除一些不可能是第k个的数,然后重新寻找。
假设两个数组为A,B。每次比较的为A[k//2-1],B[k//2-1],较小者及其之前的数都必不可能为第k个数,所以每次都排除较小者和其之前的数。
注意:当某一数组为空时,返回另一数组的未被排除的数的坐标+k 即可
当某一坐标越界时,令其指向数组末位,并且k要多减去越界的值。

二、代码

1.python

代码如下:

1.方法一

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        ret = []
        ret.extend(nums1)
        ret.extend(nums2)
        ret.sort()
        n = len(ret)
        if n%2 ==0:
            res = (ret[n//2-1] + ret[n//2])/2.
        else:
            res = ret[n//2]
        return res

2.方法二

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        def get(k):
            index1, index2 = 0, 0
            while True:
                if index1 == m :
                    return nums2[index2 + k - 1]
                if index2 == n:
                    return nums1[index1 + k - 1]
                if k == 1:
                    return min(nums1[index1] , nums2[index2])

                newIndex1 = min(k//2 + index1 - 1 ,m-1)
                newIndex2 = min(k//2 + index2 - 1 ,n-1)
                p1,p2 = nums1[newIndex1], nums2[newIndex2]
                if p1 <= p2:
                    k -= newIndex1 - index1 + 1
                    index1 = newIndex1 + 1
                else:
                    k -= newIndex2 - index2 + 1
                    index2 = newIndex2 +1 
        m,n = len(nums1), len(nums2)
        total = m + n

        if total%2 == 1:
            return get((total+1)//2)
        else:
            return (get(total//2) + get(total//2+1))/2.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值