LeetCode0004 寻找两个有序数组的中位数

题目描述

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例

示例1:

nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0

示例2:

nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3) / 2 = 2.5

求解思路

【注】思路主要是给本人自己看的,以便忘了能记起。

        首先,我们需要理解 “中位数的作用是什么”。在统计中,中位数被用来:

将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。

        如果是两个等长的数组,那么我们可以分别求2个数组的中位数,比较大小后,各自删除一半,反复如此,直到两边数组都只剩一个元素为止,最终中位数就是这两个元素的平均数。
        然而,此题没要要求两个数组长度必须一致,难就难在这里,所以只能模拟枚举。整体的中位数把元素分割成 l e f t \bf \blue {left} left r i g h t \bf \blue{right} right两个集合,我们就要探测在这两个集合中nums1nums2数组各有多少个元素在里面。
        简单的方法是类似合并两个有序列表的算法,时间复杂度是 O ( m i n ( m , n ) ) O(min(m,n)) O(min(m,n)),但是题目要求的是 O ( l o g ( m + n ) ) O(log(m+n)) O(log(m+n)),显然是要用到递归,不然时间复杂度不可能出现对数。
        怎么用递归呢,参考两个数组长度相等找中位数的算法,每次删去一部分,直到最后剩下结果。现在数组长度不相等了,这种二分元素显然行不通,所以退而求其次,二分索引,并且是长度较小的数组的索引。为什么是较短的数组?在后面编码时你会发现,探测长数组的索引可能会导致一些麻烦,需要额外的工作。
        那么,二分所引怎么用呢?通常情况,是设置两个哨兵 i _ m a x i\_max i_max i _ m i n i\_min i_min,探测位置 i = f u n c ( i _ m i n , i _ m a x ) i=func(i\_min,i\_max) i=func(i_min,i_max),通过判断 i i i是偏大还是偏小,来调整 i _ m a x i\_max i_max i _ m i n i\_min i_min值,然后继续这一步,直到找到满足中位数要求的 i i i

-------------------------------------下面开始具体算法-------------------------------------

首先,根据数组长度进行排序,令短的为nums1,长的为nums2m = len(nums1), n = len(nums2)
我们将nums1分成两个部分,左边 i i i个元素,右边 m − i m-i mi个元素,其中 0 ≤ i ≤ m 0\le i \le m 0im

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值