Median of Two Sorted Arrays
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)).
转换题意为找到第k个数,此题k=(m+n)/2
如果时间复杂度o(k)可以接受的话,可以模拟合并,找到第k个数即可
此处要求时间复杂度O(log (m+n)).基本可以确定希望我们二分。
二分一般有两个角度,一个是对结果二分,缩小结果范围,让其逼近结果;令一个是对容器二分,缩小可选范围。
这题可以用第一个角度,找第k个数,那么我们每次排除k/2个数,时间复杂度就是O(logk).
代码:
int min(int a,int b) { return a<b?a:b; } int findKth(int a[],int m,int b[],int n,int k) { if(m>n){//假设m总是小于等于n return findKth(b,n,a,m,k); } if(m==0){ return b[k-1]; } if(n==0){ return a[k-1]; } if(k==1){ return min(a[0],b[0]); } int pa = min(k/2,m); int 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 findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { if((nums1Size+nums2Size)&0x1){ return findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1); }else{ int res1 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2); int res2 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1); return (res1+res2)/2.0; } }
参考:http://blog.csdn.net/yutianzuijin/article/details/11499917/
写者:zengzy
出处: http://www.cnblogs.com/zengzy
标题有【转】字样的文章从别的地方转过来的,否则为个人学习笔记