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]<B[k-x-1],则A,B合并后的有序数组中,A[x-1]右边的数有m+n-k+1个,所以A[0]...A[x-1]必然是在前1...k-1个数内,可以去掉,把问题简化。
也就是说,设pa+pb=k,若A[pa-1]<B[pb-1],问题转化为找A+pa开始的,长度为m-pa的数组,和以B开始,长度为n的数组的第k-pa个数。
其他情况不再赘述。
代码:
就是两个有序数组,求它们组合成的有序数组的中位数。
当然,可以根据我的另一篇博文“两个等长有序数组的中位数”介绍的原理来求,但是。。。那种方法不够简洁。
有一种通用并且简洁优雅的方法来解决这个问题,那就是转化问题为:
有一个长度为m的有序数组A和一个长度为n的有序数组B,求他们合并后的有序数组(从小到大)中第k个数(当然1<=k<=m+n)
这个问题的解法:
取A中第x个数,1<=x<=k && x<=m,若A[x-1]<B[k-x-1],则A,B合并后的有序数组中,A[x-1]右边的数有m+n-k+1个,所以A[0]...A[x-1]必然是在前1...k-1个数内,可以去掉,把问题简化。
也就是说,设pa+pb=k,若A[pa-1]<B[pb-1],问题转化为找A+pa开始的,长度为m-pa的数组,和以B开始,长度为n的数组的第k-pa个数。
其他情况不再赘述。
代码:
- double f(int a[],int m,int b[],int n,int k){
- assert(k<=m+n && k>=1);
- if(m>n)
- return f(b,n,a,m,k);
- if(m==0)
- return b[k-1];
- if(k==1)
- return min(a[0],b[0]);
- else{
- int pa=min(k/2,m);
- int pb=k-pa;
- if(a[pa-1]<b[pb-1])
- return f(a+pa,m-pa,b,n,k-pa);
- else if(a[pa-1]>b[pb-1])
- return f(a,m,b+pb,n-pb,k-pb);
- else
- return a[pa-1];
- }
- }
-
- double findMedianSortedArrays(int A[], int m, int B[], int n) {
- int l=m+n;
- if(l%2!=0)
- return f(A,m,B,n,l/2+1);
- else
- return (f(A,m,B,n,l/2)+f(A,m,B,n,l/2+1))/2;
- }
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
评论热议
本文介绍了一种高效方法,用于找到两个有序数组合并后的中位数,通过递归减小问题规模,利用数组元素比较简化查找过程。
685

被折叠的 条评论
为什么被折叠?



