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)
阅读全文
0 0
- findMedianSortedArrays 寻找中位数
- findMedianSortedArrays
- 寻找中位数
- 寻找中位数
- 寻找中位数
- 关于寻找中位数
- 2:寻找中位数
- openjudge 寻找中位数
- 海量数据寻找中位数
- HDU1157寻找中位数
- 寻找中位数算法中的错误
- 海量数据中寻找中位数
- 海量数据中寻找中位数
- 海量数据中寻找中位数
- 海量数据中寻找中位数
- poj 2388 c++:寻找中位数
- 寻找3个数的中位数
- 寻找两个数组的中位数
- HDU 1002
- Redis系列(二)-Hredis客户端设计及开源
- Handler Thread Loop形象比喻
- Java中sleep()与wait()区别
- CCF201703-1分蛋糕JAVA版
- findMedianSortedArrays 寻找中位数
- 深度神经网络(DNN)模型与前向传播算法
- Redis系列(三)-Redis发布订阅及客户端编程
- Scala 深入浅出实战经典 第46讲: ClassTag 、Manifest、ClasMainifest TagType实战
- poj 2891 Strange Way to Express Integers 扩欧解模线性方程
- MyBatis框架的 resultMap(自连接,一对多,多对多)映射
- 2438: [中山市选2011]杀人游戏
- ×347. Top K Frequent Elements(Java)
- python 判断dict中是否含有某个key