参考自:http://blog.csdn.net/yutianzuijin/article/details/11499917/
明显时间复杂度要求log,很容易想到二分。但是对于数组二分没法做,那就对于第(m+n)/2这个数字进行二分,因为就是要求顺序位置在这里的数
思考对于第k大的数,两个数组元素中a[k/2-1]和b[k/2-1]进行比较,小的那个数肯定不可能是符合要求的数,且其所在的数列中比它小的数也不可能符合要求这样就能排除一部分数,同时k也可以减去一半,直到k为1或者有个数列中元素被减光或者a[k/2-1],b[k/2-1]相等(此时必定为要求的数)。问题是题目给出的是不定长数组我猥琐地变成了数组,要不然find函数内形参就太多了,因为要时时记录左右边界,没数组那么方便,不知道vector可不可以有数组那样的用法,,,
1 int find(int a[],int m,int b[],int n,int k){ 2 if(m == 0) return b[k-1]; 3 if(m > n) return find(b,n,a,m,k); 4 if(k == 1) return min(a[0],b[0]); 5 int pa = min(k/2,m),pb = k - pa; 6 if(a[pa-1] < b[pb-1]) return find(a + pa,m - pa,b,n,k-pa); 7 else if(a[pa - 1] > b[pb - 1]) return find(a,m,b + pb,n - pb,k - pb); 8 else return a[pa-1]; 9 } 10 class Solution { 11 public: 12 double findMedianSortedArrays(vector<int>&nums1, vector<int>nums2) { 13 int a = nums1.size(),b = nums2.size(); 14 int num1[100000],num2[100000]; 15 for(int i = 0;i < a;i++) num1[i] = nums1[i]; 16 for(int i = 0;i < b;i++) num2[i] = nums2[i]; 17 if((a+b)&1) return find(num1,a,num2,b,(a+b)/2+1); 18 else return ( 19 ((double)find(num1,a,num2,b,(a+b)/2) + (double)find(num1,a,num2,b,(a+b)/2+1))/2 20 ); 21 } 22 };