LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
2015-12-28 12:24
591 查看
题目:
解题思路:
我自己想的方法,先排序在查找。两个数组,首先想到是归并排序,然后再查找两个数组合并之后的中间元素即为中位数。我们分析下时间复杂度主要用在了归并排序上,为O((m+n)log(m+n)),显然不符合题目要求。题目要求是O(log(m+n)),但是我将这个方法的代码提交上去,仍然通过了,说明LeetCode的编译平台并没有严格按照ACM OJ这种要求来设置。排序后查找的代码如下所示:
看了下本题的难度系数,属于Hard级别的,说明本题不是那么容易对付的,又看了一下本题的Tag,其中罗列了两个重要的Tag:Divide and Conquer和Binary Search,说明本题需要用到两个方法:分治法和二分查找法,看了讨论里面,发现一种方法是这样的:求有序数组A和B有序合并之后第k小的数!如果A[k/2-1]<B[k/2-1],那么A[0]~A[k/2-1]一定在第k小的数的序列当中,可以用反证法证明。详细的思路请见这篇博文。代码如下:
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)). Subscribe to see which companies asked this question
解题思路:
我自己想的方法,先排序在查找。两个数组,首先想到是归并排序,然后再查找两个数组合并之后的中间元素即为中位数。我们分析下时间复杂度主要用在了归并排序上,为O((m+n)log(m+n)),显然不符合题目要求。题目要求是O(log(m+n)),但是我将这个方法的代码提交上去,仍然通过了,说明LeetCode的编译平台并没有严格按照ACM OJ这种要求来设置。排序后查找的代码如下所示:
//方法一:归并排序后查找:O((m+n)lg(m+n)),奇怪竟然通过了 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { size_t n1 = nums1.size(), n2 = nums2.size(); size_t n = n1+n2; vector<int> nums(n,0); assert(n > 0); nums1.push_back(INT_MAX); nums2.push_back(INT_MAX); size_t i = 0, j = 0, k = 0; while(i < n1 || j < n2) { if (nums1[i] <= nums2[j]) { nums[k++] = nums1[i++]; } else nums[k++] = nums2[j++]; } return ((n%2) ? (double)nums[(n-1)/2]:(double)(nums[(n-1)/2]+nums[n/2])/2); }
看了下本题的难度系数,属于Hard级别的,说明本题不是那么容易对付的,又看了一下本题的Tag,其中罗列了两个重要的Tag:Divide and Conquer和Binary Search,说明本题需要用到两个方法:分治法和二分查找法,看了讨论里面,发现一种方法是这样的:求有序数组A和B有序合并之后第k小的数!如果A[k/2-1]<B[k/2-1],那么A[0]~A[k/2-1]一定在第k小的数的序列当中,可以用反证法证明。详细的思路请见这篇博文。代码如下:
//方法二:二分法:O(lg(m+n)),满足题目要求 //get the kth number of two sorted array double findkth(vector<int>::iterator a,int m, vector<int>::iterator b,int n, int k) { if(m > n) return findkth(b,n,a,m,k); if(m == 0) return b[k-1]; if(k == 1) return min(*a,*b); int pa = min(k/2,m),pb = k - pa; if(*(a + pa - 1) < *(b + pb -1)) return findkth(a+pa,m-pa,b,n,k-pa); else if(*(a + pa -1) > *(b + pb -1)) return findkth(a,m,b+pb,n-pb,k-pb); else return *(a+pa-1); } double findMedianSortedArrays1(vector<int>& nums1, vector<int>& nums2) { vector<int>::iterator a = nums1.begin(); vector<int>::iterator b = nums2.begin(); int total = nums1.size() + nums2.size(); // judge the total num of two arrays is odd or even if(total & 0x1) return findkth(a,nums1.size(),b,nums2.size(),total/2+1); else return (findkth(a,nums1.size(),b,nums2.size(),total/2) + findkth(a,nums1.size(),b,nums2.size(),total/2 + 1))/2; }
相关文章推荐
- cocos js- android 平台 java与js互调 , ios平台 Objective-c与js互调
- weblogic下开发hibernate发生jar包冲突问题
- 数据库连接池Druid
- 【LEETCODE】223-Rectangle Area
- Quartz2D-绘线
- Bezier曲线
- context
- YII使用url组件美化管理的方法
- python 遍历文件夹和子目录抓出自己想用的文件类型
- 2015年12月28日课堂笔记与作业
- phpMyAdmin 手动输入数据库服务器IP
- ios-@property属性(特性)
- window.load和document.ready的区别
- 3D touch功能
- 恩布企业 IM 安卓端 1.3,服务端 1.12 公布
- winXP开始菜单中的历史记录怎么清除?
- kubernetes-1.0.3集群安装部署
- eclipse中快速打开Genymotion插件
- Android Jni层调用应用层(Java)的方法
- Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案