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.size() <= nums2.size(),若相反,则调换位置(line9)。找到nums1的分割点mid1,nums2的分割点mid2。
如果nums1[mid1-1] < nums2[mid2-1],表示median number肯定在nums1[mid]~nums1[nums1.size()-1] + nums2[0] ~ nums2[mid2-1]之间,那么可以删掉nums1[0]~nums1[mid1-1]区间内的数字。
同理,若nums1[mid1-1] > nums2[mid2-1],那么可以删掉nums2[0]~nums2[mid2-1]之间的数字。
要特别注意的是不要用题目中所给的引用类形参!!
运行时间为81ms。
1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int> nums1, vector<int> nums2) { 4 int len = nums1.size() + nums2.size(); 5 if(len & 0x1) return find(nums1, nums2, len / 2 + 1); 6 else return (find(nums1, nums2, len / 2) + find(nums1, nums2, len / 2 + 1)) / 2; 7 } 8 double find(vector<int> nums1, vector<int> nums2, int k){ 9 if(nums1.size() > nums2.size()) return find(nums2, nums1, k); 10 if(nums1.size() == 0) return nums2[k-1]; 11 if(k == 1) return min(nums1[0], nums2[0]); 12 13 //compute the partition part of each vector 14 int mid1 = k / 2 < nums1.size() ? k / 2 : nums1.size(), mid2 = k - mid1; 15 vector<int>::iterator ite; 16 if(nums1[mid1-1] < nums2[mid2-1]){ 17 ite = nums1.begin(); 18 for(int i = 0; i < mid1; i++) ite++; 19 nums1.assign(ite, nums1.end()); 20 return find(nums1, nums2, k - mid1); 21 } 22 else if(nums1[mid1-1] > nums2[mid2-1]){ 23 ite = nums2.begin(); 24 for(int j = 0; j < mid2; j++) ite++; 25 nums2.assign(ite, nums2.end()); 26 return find(nums1, nums2, k - mid2); 27 } 28 else return nums1[mid1-1]; 29 } 30 };