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)).

分析:题目要求复杂度为对数型,可以借鉴二分法,每次删掉不符合条件的一半。

默认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 };
原文地址:https://www.cnblogs.com/amazingzoe/p/4492812.html