两个有序的数组 nums1 和 nums2 维数分别为m,n。找所有数的中位数,复杂度 O(log (m+n))
注意:奇偶个数,分治法求解,递归出口特殊处理。取Kth smallest数时,分治取mid=k/2和k-mid,避免奇数造成影响。
1 class Solution { 2 double findKth(vector<int> num1,vector<int> num2, int k) 3 { 4 int m = num1.size(), n = num2.size(); 5 if(m > n) 6 return findKth(num2,num1,k); 7 if(m == 0) 8 return num2[k-1]; 9 if(k == 1) 10 return num1[0]>num2[0]?num2[0]:num1[0]; 11 int mid1=min(k/2,m), mid2=k-mid1; 12 if(num1[mid1-1]>num2[mid2-1]) 13 return findKth(num1,vector<int>(num2.begin()+mid2,num2.end()),k-mid2); 14 else if(num1[mid1-1]<num2[mid2-1]) 15 return findKth(vector<int>(num1.begin()+mid1,num1.end()),num2,k-mid1); 16 else 17 return num1[mid1-1]; 18 19 } 20 21 public: 22 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 23 int m = nums1.size(), n = nums2.size(); 24 return (findKth(nums1, nums2, (m + n + 1) / 2) + findKth(nums1, nums2, (m + n + 2) / 2)) / 2.0; 25 } 26 };