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;

}

results matching ""

    No results matching ""