LeetCode: Median of Two Sorted Arrays

来源:互联网 发布:金城武哪里帅了知乎 编辑:程序博客网 时间:2024/06/07 06:46

There are two sorted arrays A and B 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))

class Solution {public:    double findMedianSortedArrays(int A[], int m, int B[], int n) {        if((m+n) % 2 == 0)            return (helper(A, m, B, n, (m+n)/2) + helper(A, m, B, n, (m+n)/2 - 1)) / 2.0;        else            return helper(A, m, B, n, (m+n)/2);            }private:    int helper(int A[], int m, int B[], int n, int k)    {        if(m == 0)        {            return B[k];         }        if(n == 0)            return A[k];        if(k == 0)            return std::min(A[0], B[0]);        if(m/2 + n/2 > k)        {            if(A[m/2] >= B[n/2])            {                return helper(A, m/2, B, n, k);            }            else            {                return helper(A, m, B, n/2, k);            }        }        else        {            if(A[m/2] >= B[n/2])            {                return helper(A, m, B+(n/2), (n+1)/2 - 1, k-(n+1 - (n+1)/2));            }            else            {                return helper(A + m/2, (m+1)/2 - 1, B, n, k-(m+1 - (m+1)/2));            }        }    }    };

Round 2:

class Solution {public:    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {        int m = nums1.size()-1;        int n = nums2.size()-1;        int k = (m + n + 2)/2;        if((m + n) % 2 == 0)        {            return ((getMedian(0, m, 0, n, nums1, nums2, k) + getMedian(0, m, 0, n, nums1, nums2, k-1)) / 2.0f);        }        else        {            return getMedian(0, m, 0, n, nums1, nums2, k);        }            }private:    double getMedian(int s1, int e1, int s2, int e2, vector<int> &nums1, vector<int> &nums2, int k)    {        if(s1 > e1)            return nums2[s2 + k];        if(s2 > e2)            return nums1[s1 + k];        if(k == 0)            return std::min(nums1[s1], nums2[s2]);        int m = e1 - s1 + 1;        int n = e2 - s2 + 1;        if(k == m/2 + n/2 && nums1[s1 + m/2] == nums2[s2 + n/2])        {            return nums1[s1 + m/2];        }        if(m/2 + n/2 >= k)        {            if(nums1[s1 + m/2] > nums2[s2 + n/2])            {                return getMedian(s1, s1 + m/2 - 1, s2, e2, nums1, nums2, k);            }            else            {                return getMedian(s1, e1, s2, s2 + n/2 - 1, nums1, nums2, k);            }        }        else        {            if(nums1[s1 + m/2] > nums2[s2 + n/2])            {                return getMedian(s1, e1, s2 + n/2 + 1, e2, nums1, nums2, k - n/2 - 1);            }            else            {                return getMedian(s1 + m/2 + 1, e1, s2, e2, nums1, nums2, k - m/2 - 1);            }        }    }};


0 0
原创粉丝点击