Median of Two Sorted Arrays

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

 

思路:这里进一步寻找第k小的元素。(参考http://leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html)

每一步中取i+j=k-1,如果,Bj_1 <= Ai && Ai <= Bj或者Ai_1 <= Bj && Bj <= Ai,那么,Ai或者Bj为所求。如果A和B不满足这个条件,那么,可以去掉不可能的一般的元素,然后再剩下的元素中找。

 

int findKthSmallest(int A[], int m, int B[], int n, int k) {
	assert(m >= 0); assert(n >= 0); assert(k > 0); assert(k <= m+n);

	int i = (int)((double)m / (m+n) * (k-1));
	int j = (k-1) - i;
	assert(i >= 0); assert(j >= 0); assert(i <= m); assert(j <= n);
	
	int Ai_1 = ((i == 0) ? INT_MIN : A[i-1]);
	int Bj_1 = ((j == 0) ? INT_MIN : B[j-1]);
	int Ai   = ((i == m) ? INT_MAX : A[i]);
	int Bj   = ((j == n) ? INT_MAX : B[j]);
  
	if (Bj_1 <= Ai && Ai <= Bj)  // 反面是Ai > Bj或者Ai<Bj_1
		return Ai;
	else if (Ai_1 <= Bj && Bj <= Ai)// 剩下的反面是Ai > Bj且Ai_1 > Bj  或者Ai<Bj_1且Bj > Ai
		return Bj;

	assert((Ai >=Bj && Ai_1 >= Bj) || (Ai <=Bj && Ai <=Bj_1));

	if (Ai <=Bj)  //Ai<Bj_1和Bj,那么满足条件的i应该右移(Ai增大),j左移(Bj_1减小)
		return findKthSmallest(A+i+1, m-i-1, B, j, k-i-1);
       else 
	       return findKthSmallest(A, i, B+j+1, n-j-1, k-j-1);
}

 

double findMid(int A[], int m, int B[], int n){
	int a=m+n;
	if(a%2!=0)
		return  findKthSmallest(A, m, B ,n,a/2+1);
	else
		return (findKthSmallest(A, m, B ,n,a/2)+ findKthSmallest(A, m, B ,n,a/2+1))/2.0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值