1. 题目
004-Median_of_two_sorted_arrays
2. 算法
http://www.acmerblog.com/leetcode-median-of-two-sorted-arrays-5330.html
http://usagi.cc/article/index.php?aid=10006
- 要求复杂度O(nlg(n+m))
3. 代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include <stack>
#include<unordered_map>
#include <utility>
using namespace std;
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size() + nums2.size();
if (total & 0x1 ) {
return findKth(nums1, nums2, total / 2 + 1);
} else {
vector<int>a ,b;
a.assign(nums1.begin(),nums1.end());
b.assign(nums2.begin(),nums2.end());
return (findKth(nums1, nums2, total / 2) + findKth(a,b, total / 2 + 1)) / 2;
}
}
double findKth(vector<int> &A, vector<int> &B, int k) {
int m=A.size();
int n=B.size();
if (m > n) return findKth(B,A,k);
if (m == 0) return B[k - 1];
if (k == 1) return min(A[0], B[0]);
int pa = min(k / 2, m), pb = k-pa;
if (A[pa - 1] < B[pb - 1]){
A.erase(A.begin(),A.begin()+pa);
return findKth(A,B,k-pa);
}
else if (A[pa - 1] > B[pb - 1]) {
B.erase(B.begin(),B.begin()+pb);
return findKth(A,B,k-pb);
}
else {
return A[pa - 1];
}
}
};
int main(){
int a[]={1,2,3,4};
int b[]={5,6,7,8};
vector<int> A(&a[0],&a[4]);
vector<int> B(&b[0],&b[4]);
Solution solution;
double result = solution.findMedianSortedArrays(A, B);
cout<<result<<endl;
}