leetcode MEDIAN OF TWO SORTED ARRAYS

MEDIAN OF TWO SORTED ARRAYS

原文地址:http://oj.leetcode.com/problems/median-of-two-sorted-arrays/

题意:寻找两个有序数组的中位数。如果m+n是奇数则返回中间的值,否则返回中间两个数的平均值。

解题思路:寻找第K大的数。

算法很快就想到了,我想到的算法稍微有点儿麻烦,需要考虑的情况比较多,主要思想就是从后往前,去掉那些不可能在前k序列里面的数。每个有序数组建立一个下标index和一个后范围r;如果两个数组的index范围内的数大于k个,那么可以二分缩小其中一个数组的范围;直到刚好等于k个元素的时候又做进一步分析

另外一种解题思路,也是网上普遍使用的,思想跟我的相反,从前往后,直接二分寻找这k个小元素,假设两个数组的元素都大于k/2个,那么一定可以先确定最小k序列里面的k/2个元素了,然后依次递归实现。


第二种思路很多贴可见,此处贴上我自己算法的代码,有点儿小麻烦,时间复杂度同样是O(log(n+m))

class Solution {
public:
    double exfindMedianSortedArrays(int A[], int m, int B[], int n, int target){
int ra,rb,indexa,indexb;
if(m==0) return B[target-1];
ra=m-1;
rb=n-1;
indexa=ra;
indexb=rb;
//printf("target:%d\n",target);
while(true)
{
int range = indexa+indexb+2;
//printf("%d %d",indexa ,indexb);getchar();
if(range>target)//如果当前包含的元素大于目标个数
{
if(A[indexa]>=B[indexb])//固定ra,并且二分indexa
{
if( ra == 0)//无法缩小了
{
return B[target - 1];
}
ra = indexa;
indexa = ra/2;
}
else //固定rb,并且二分indexb
{
if(rb == 0)//无法缩小了
{
return A[target-1];
}
rb = indexb;
indexb = rb/2;
}


}///end if : about range >target
else if(range<target)//如果当前包含的元素小于目标个数
{
if(indexa != ra )
{
indexa = (indexa + ra)/2;
}


if(indexb != rb)
{
indexb = (indexb+rb)/2;
}

}///end if :about range < target
else//如果当前包含的元素等于目标个数
{
if(A[indexa]<B[indexb])
{
if( indexa == ra)//如果不能再继续判断下一个数
{
return B[indexb];
}


if(A[indexa+1] < B[indexb])
{
indexa = (indexa+ra)/2;
}
else 
{
return B[indexb];
}
}
else if(A[indexa]==B[indexb])
{
return B[indexb];
}
else //A[indexa]>B[indexb])
{
if(indexb == rb)//不能再判断下一个
{
return A[indexa];
}
if(B[indexb+1]<A[indexa])
{
indexb = (indexb+rb)/2;
}
else
{
return A[indexa];
}
}/end else
}/end if :about range = target
}end while
}
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
if(m<=n)
{
  if( (m+n)%2==0)
  {
  double t1 = exfindMedianSortedArrays(A,m,B,n, (m+n)/2);
  double t2 = exfindMedianSortedArrays(A,m,B,n, (m+n)/2+1);
 // printf("%f %f\n",t1,t2);
  return (t1+t2)/2;
  }
  else return exfindMedianSortedArrays(A,m,B,n, (m+n+1)/2);
}
else
{
if( (m+n)%2 == 0)
{
  double t1 = exfindMedianSortedArrays(B,n,A,m,(m+n)/2);
  double t2 = exfindMedianSortedArrays(B,n,A,m,(m+n)/2+1);
//    printf("%f %f\n",t1,t2);
  return (t1+t2)/2;
}
else return exfindMedianSortedArrays(B,n,A,m, (m+n+1)/2);
}
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值