Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121069
  • 博文数量: 53
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-24 16:22
文章存档

2014年(53)

我的朋友

分类: C/C++

2014-10-02 22:13:11

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)).

就是两个有序数组,求它们组合成的有序数组的中位数。

当然,可以根据我的另一篇博文“两个等长有序数组的中位数”介绍的原理来求,但是。。。那种方法不够简洁。

有一种通用并且简洁优雅的方法来解决这个问题,那就是转化问题为:

有一个长度为m的有序数组A和一个长度为n的有序数组B,求他们合并后的有序数组(从小到大)中第k个数(当然1<=k<=m+n)

这个问题的解法:

取A中第x个数,1<=x<=k && x<=m,若A[x-1]
也就是说,设pa+pb=k,若A[pa-1]
其他情况不再赘述。

代码:

  1. double f(int a[],int m,int b[],int n,int k){
  2.     assert(k<=m+n && k>=1);
  3.     if(m>n)
  4.         return f(b,n,a,m,k);
  5.     if(m==0)
  6.         return b[k-1];
  7.     if(k==1)
  8.         return min(a[0],b[0]);
  9.     else{
  10.         int pa=min(k/2,m);
  11.         int pb=k-pa;
  12.         if(a[pa-1]<b[pb-1])
  13.             return f(a+pa,m-pa,b,n,k-pa);
  14.         else if(a[pa-1]>b[pb-1])
  15.             return f(a,m,b+pb,n-pb,k-pb);
  16.         else
  17.             return a[pa-1];
  18.     }
  19. }

  20. double findMedianSortedArrays(int A[], int m, int B[], int n) {
  21.     int l=m+n;
  22.     if(l%2!=0)
  23.         return f(A,m,B,n,l/2+1);
  24.     else
  25.         return (f(A,m,B,n,l/2)+f(A,m,B,n,l/2+1))/2;
  26. }



阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~