LeetCode Algorithm部分.004
【004】 Median of Two Sorted Arrays
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]The median is (2 + 3)/2 = 2.5
经分析,此题实际就是归并的问题,所以首先想到的是STL里的merge()。
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> v(nums1.size()+nums2.size());
merge(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),v.begin());
double i;
if(v.size()%2==0){
i = (v[v.size()/2-1]+v[v.size()/2])/2.0;
} else {
i = v[(v.size()+1)/2-1];
}
return i;
}
显然其时间复杂度要符合O(log(m+n))的要求,然而还有其它方法,下面就列举一种二分查找的方法,以更加清晰的体现分治的思想。
int getkth(int s[], int m, int l[], int n, int k){
// let m <= n
if (m > n)
return getkth(l, n, s, m, k);
if (m == 0)
return l[k - 1];
if (k == 1)
return min(s[0], l[0]);
int i = min(m, k / 2), j = min(n, k / 2);
if (s[i - 1] > l[j - 1])
return getkth(s, m, l + j, n - j, k - j);
else
return getkth(s + i, m - i, l, n, k - i);
return 0;
}
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int l = (m + n + 1) >> 1;
int r = (m + n + 2) >> 1;
return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0;
}