题目描述:
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)).
分析:
1. 本题可以采用merge(归并)法,将两个数组再排序,然后求中位数,此方法比较好像,但是时间复杂度为O(m+n)
2.分治法(divide and conque)
方法一:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> c;
int p1 = 0, p2 = 0;
int m = nums1.size();
int n = nums2.size();
while(p1 < m || p2 < n){
if(p1 == m){
c.push_back(nums2[p2++]);
continue;
}
if(p2 == n){
c.push_back(nums1[p1++]);
continue;
}
if(nums1[p1] > nums2[p2]){
c.push_back(nums2[p2++]);
}
else c.push_back(nums1[p1++]);
}
if((m+n)&1){
return c[(m+n)/2];
}
else return (c[(m+n)/2-1]+c[(m+n)/2])/2.0;
}
};
方法二:
class Solution {
private:
double findKthSortedArrays(int A[], int m, int B[], int n, int k) {
if (m < n) {
swap(n, m);
swap(A, B);
}
if (n == 0)
return A[k - 1];
if (k == 1)
return min(A[0], B[0]);
int pb = min(k / 2, n), pa = k - pb;
if (A[pa - 1] > B[pb - 1])
return findKthSortedArrays(A, m, B + pb, n - pb, k - pb);
else if (A[pa - 1] < B[pb - 1])
return findKthSortedArrays(A + pa, m - pa, B, n, k - pa);
else
return A[pa - 1];
}
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
if ((n + m)&1)
return findKthSortedArrays(A, m, B, n, (n + m) / 2 + 1);
else
return (findKthSortedArrays(A, m, B, n, (n + m) / 2 + 1) +
findKthSortedArrays(A, m, B, n, (n + m) / 2)) / 2.0;
}
};
该算法不好想,编程实现有点难,不过加油!参考文献
[2]分治算法