找两个排序数组的中位数

题目:给定两个排序的数组a,b,长度分别为m和n,找出这两个数组的中位数。时间复杂度为O(log(m+n))。

比如:a=[1,2,3,4],b=[2,3,4,]中位数为3。


假定a,b长度分别大于k,现在选择第k个数(排序后的第k个),先将a的第k/2个元素(a[k/2-1]和b的第k/2个元素(b[k/2-1]比较,存在以下三种情况:

a[k/2-1]==b[k/2-1],第k个数找到了,就是a[k/2-1]或b[k/2-1]

a[k/2-1]>b[k/2-1],第k个数肯定不在b[0...k/2-1],删除这一段

a[k/2-1]<b[k/2-1],第k个数肯定不在a[0...k/2-1],删除这一段

int mid(int a[],int b[],int m,int n,int k) //假定m<=n
{
	if(m>n)  //若不是m<=n,调换一下  
		return mid(b,a,n,m,k);
	if(m==0)
		return b[k-1];
	if(k==1)
		return Min(a[0],b[0]);

	int ia=Min(k/2,m);
	int ib=k-ia;
	if(a[ia]==b[ib])  //第k个数找到
		return a[ia];
	if(a[ia]>b[ib])   //第k个数肯定不在b[0..ib],所以,删除这些,找第k-ib个数
		return mid(a,b+ib,m,n-ib,k-ib);
	else  //a[ia]<b[ib] 第k个数肯定不在a[0...ia],所以,删除这些,找k-ia个数
		return mid(a+ia,b,m-ia,n,k-ia);
}
	
int Mid(int a[],int b[],int m,int n)
{
	int k=(m+n)/2;
	return mid(a,b,m,n,k);
}



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值