本文主要是介绍二分查找:联合中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给出两个长度为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)).
这篇关于二分查找:联合中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!