findMedianSortedArrays 寻找中位数

来源:互联网 发布:linux系统管理员证书 编辑:程序博客网 时间:2024/06/07 02:25
c语言版本运行时间35ms,python版本95ms,参考http://blog.csdn.net/yutianzuijin/article/details/11499917/,博主写的特别好。
/*There are two sorted arrays nums1 and nums2 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)).两个递增数组,长度分别为nums1、nums2,找到其中的中位数。分析:    total=nums1+nums2 ,如果total为奇数,则中位数为两个数组排序后第total/2+1值;如果total为偶数,则中位数为两个数组排序后第total/2+1值与第total/2个值的均值。若采用归并排序,其时间复杂度为O(total log(total)),不能解决问题。采用寻找第k个值的问题(两个序列均为升序),即寻找total/2的值(奇数)或均值。    设两个数组分别为a,b;数组长度分别为m,n.把数组a,b都分为两部分,数组a左边的元素数为pm,pm为k/2与m中的较小的一个值,a[pm-1]左边有pm-1个元素比它小;数组b左边的元素数为pn,pn=k-pm,b[pn-1]左边有pn-1个值比它小。通过比较a[pm-1]与b[pn-1]的值,小的那个值其左边的所有元素必定都比第k个元素小,故可舍去这部分小的元素并调整k的值(k的值减去舍弃的元素个数),然后重复以上步骤;如果a[pm-1]与b[pn-1]相等,则这两个值即使第k个元素值边界:如果a或者b为空,则直接返回a[k-1]或者b[k-1];如果k为1,我们只需要返回a[0]和b[0]中的较小值;如果a[k/2-1]=b[k/2-1],返回其中一个;*/#include <stdio.h>double findKth(int *a,int m,int *b,int n,int k){if(m>n)return findKth(b,n,a,m,k);  //选择长度短的在前面,方便后面部分选取if(m==0)return b[k];//数组a为空,之间返回数组b的第k个值if(k==1)return a[0]>b[0] ? b[0] : a[0];int pm= m > k/2 ? k/2 : m;   //选择pm部分的值int pn= k - pm; //pm 部分与pn 部分数量和为kif(a[pm-1] > b[pn-1])  //数组a的第pm个值与数组b的第pn个值进行比较 然后把小的部分丢掉    return findKth(a,m,b+pn,n-pn,k-pn);else if(a[pm-1] < b[pn-1])return findKth(a+pm,m-pm,b,n,k-pm);elsereturn a[pm-1];  //两者相等,即找到第k个值}double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {    int total=nums1Size+nums2Size;    if(total%2 == 1)        return findKth(nums1,nums1Size,nums2,nums2Size,total/2+1);    else        return ( findKth(nums1,nums1Size,nums2,nums2Size,total/2+1)+ findKth(nums1,nums1Size,nums2,nums2Size,total/2))/2;}int main(int argc,char **argv){int a[]={255,586,877};int b[]={1,2,5,6,9,10,23,66,77};int i=sizeof(a)/sizeof(int);int j=sizeof(b)/sizeof(int);int total=i+j;printf("%f\n",findMedianSortedArrays(a,i,b,j));return 0;}

class Solution:  def findMedianSortedArrays(self, A, B):    l = len(A) + len(B)    if l % 2 == 1:        return self.kth(A, B, l // 2)    else:        return (self.kth(A, B, l // 2) + self.kth(A, B, l // 2 - 1)) / 2.         def kth(self, a, b, k):    if not a:        return b[k]    if not b:        return a[k]    ia, ib = len(a) // 2 , len(b) // 2    ma, mb = a[ia], b[ib]        # when k is bigger than the sum of a and b's median indices     if ia + ib < k:        # if a's median is bigger than b's, b's first half doesn't include k        if ma > mb:            return self.kth(a, b[ib + 1:], k - ib - 1)        else:            return self.kth(a[ia + 1:], b, k - ia - 1)    # when k is smaller than the sum of a and b's indices    else:        # if a's median is bigger than b's, a's second half doesn't include k        if ma > mb:            return self.kth(a[:ia], b, k)        else:            return self.kth(a, b[:ib], k)a=[78,89]b=[3,5,6,7,89]m=Solution()print m.findMedianSortedArrays(a,b)

原创粉丝点击