二分查找:联合中位数

题目描述

给出两个长度为n的数组A1,A2,...An, B1,B2,...Bn,所有2n个数互不相同,并且数组A和数组B按照升序排列。要求找出这2n个数的中位数。

输入

输入分3行:第1行是n的值,第2行是以空格分隔的数组A的元素,第3行是以空格分隔的数组B的元素。2、3行最后有空格。

输出

输出所求中位数,末尾没有空格。

样例输入

4
1 2 3 4 
5 6 7 8 

样例输出

4

提示

使用时间复杂度为O(logn)的方法。
由于输入输出的量会比较大,因此推荐使用c语言中的scanf和printf函数来进行输入输出,能比c++中cin和cout节省许多时间。

解决方法(找第k小的元素)

我们可以模仿log(n)查找中位数的思路。

因为两个数组是从小到大排好顺序的。先分别找到两个数组的第k/2小的元素a,b,比较它们的大小。如果a<b,那么两个数组第k大的元素在a元素之后,b元素之前。

如下图

我们要在图中蓝色部分的两个子数组找到第k/2小的元素。这样我们就可以递归了 。

复杂度T(n)=T(n/2)+1

T(n) = O(log(n)).


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值