求两个等长有序数组的中位数的logN算法 分治法

题目:有两个长为n的非递减数组A和B,把B接在A的后面变成长为2n的数组C。设计算法求C的中位数(第n小数)。

思路:O(n)的算法很容易找到,关键是用二分的思想设计logn算法。这题关键是用好a和b数组中脚标和为定值的元素的大小关系。

            直观想法是:如果中位数在数组a中,那么若a[m]<b[n-m-2],此时比a[m]小的数最多只有n-2个,即a[m]不可能为第n小数,偏小更新左界;若a[m]> b [n-m-1],此时比a[m]小的数至少有n个,a[m]不可能为第n小数,偏大更新右界;若a[m]介于b[n-m-2]与b [n-m-1]则a[m]恰好为第n小数。 中位数在数组b中的情况类似。

#include <iostream>
using namespace std;

int findNthNumber(int a[], int b[], int n){
	int l = 0, r = n -1;
	int m;
	while(l <= r){
		m = (l + r) / 2;
		if(m == n - 1 || a[m] < b[n - m -2]){
			//此时比a[m]小的数最多只有n-2个,即a[m]不可能为第n小数,偏小更新左界
			l = m + 1;
		}
		else if (a[m] < b [n - m - 1]){
			//此时比a[m]小的数恰好有n-1个,a[m]就是第n小数,返回
			return a[m];
		}
		else r = m - 1;//此时比a[m]小的数至少有n个,即a[m]不可能为第n小数,偏大更新右界
	}
	//中位数在b数组中的情况
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值