leetcode:两个有序数组的中位数

一个好题目:

两个有序数组,输出这两个有序数组合并后的中位数,要求复杂度为O(log (m+n)).

https://zhuanlan.zhihu.com/p/39129143

很经典的讲解,将问题最后解析为数学问题,控制变量法为单变量,就不那么复杂了。学到了,这个题目在很多领域都有应用,特别是在大数据情况下的,分治的思想

todo:自己的理解

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        m = len(nums1)
        n = len(nums2)
        if m>n:
            nums1,nums2,m,n = nums2,nums1,n,m
        if n == 0:
            return None
        imin = 0
        imax = m
        half_len = (m + n + 1)//2
        while imin <= imax:
            i = (imin + imax) // 2
            j = half_len - i
            # 三种情况
            if i>0 and nums1[i-1]>nums2[j]:
                # i 太大了
                imax = i - 1
            elif i<m and nums1[i]<nums2[j-1]:
                # i 太小了
                imin = i + 1
            else:
                # 找到了,先算左边
                if i == 0:
                    # 数组nums1整个大于nums2
                    max_left = nums2[j-1]
                elif j == 0:
                    # 数组nums2整个大约num1
                    max_left = nums1[i-1]
                else:
                    max_left = max(nums1[i-1],nums2[j-1])
                # 奇数,左边比右边大一个
                if (m + n) % 2 == 1:
                    return max_left

                if i == m:
                    # nums1 整个小于 num2
                    min_right = nums2[j]
                elif j == n:
                    # nums2 整个大约nums1
                    min_right = nums1[i]
                else:
                    # 正常情况
                    min_right = min(nums1[i],nums2[j])
                # 偶数
                return (max_left + min_right)/2.0

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值