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

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

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

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

有一个长度为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个数。

其他情况不再赘述。

代码:

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



<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) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值