计算两个有序数组的中位数

这篇博客介绍了如何在给定两个有序数组的情况下,利用二分和递归算法找到它们的中位数。通过将问题转化为求合并后数组的第(m+n+1)/2个元素,作者提出了对k进行二分搜索的方法,确保每次跳过k/2个元素,以较小的数组前进,以找到第k小的值。最终,这种方法能以O(log (m+n))的时间复杂度解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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

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

 

类比一个数组的中位数,求两个数组的中位数就相当于把两个数组合并后的一个数组的中位数,例

输入: num1=[1,3,5]  num2=[2,4,6]

输出:(3+4)/2=3.5

 

方法:二分+递归

思路:

--看到有序,并且明确要求时间复杂度为log级的,肯定需要二分。但是请注意,很多人一看到二分,就想也不想的开始对数组进行二分,但是对于这题,对数组二分就进了死胡同了。这题是对另一个量进行二分。

--再分析中位数的特征,就是求数组中的某一个(或两个)数,其左右两边的个数相等

--设两个有序数组分别为,a,长度m;b,长度n

--那么这个中位数,就是,a和b合并后的第(m+n+1)/2个(先不管有2个中位数的情况,后面会有个小技巧来屏蔽奇偶差异)

--那么现在的问题就变成了,求两个有序数组中,从小到大的第k个值

--所以二分其实是对k进行二分,两个数组同时从0开始,每次往后跳k/2个,当然不是同时跳,谁更小才能跳,保证已经跳过的数在整个数组中是最小的

 

NO BB,上代码,先写求第k个值的方法


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值