首页 > 其他 > 详细

LeetCode "Median of Two Sorted Arrays"

时间:2014-08-21 13:13:24      阅读:315      评论:0      收藏:0      [点我收藏+]

1A! We get median of each array and compare them, then we know which half should be disguarded and how many should be disguarded.

class Solution {
public:
    double findMidArr(int A[], int s, int e, int &chopLen)
    {
        int len = e - s + 1;
        chopLen = (s + e) / 2 - s;
        if (len % 2)    return A[(s + e) / 2];
        else            return (A[(s + e) / 2] + A[(s + e) / 2 + 1]) / 2.0;
    }
    double findMidMinor(int sm[], int cntSm, int lg[], int cntLg)
    {
        vector<int> v;
        v.assign(lg, lg + cntLg);
        
        v.insert(v.end(), sm, sm + cntSm);
        std::sort(v.begin(), v.end());

        size_t len = v.size();
        if (len % 2)    return v[len / 2];
        else            return (v[len / 2] + v[len / 2 - 1]) / 2.0;
    }
    double findMid(int A[], int sa, int ea, int B[], int sb, int eb)
    {
        int lenA = ea - sa + 1;
        int lenB = eb - sb + 1;

        //    Base cases
        if (lenA <= 2)    return findMidMinor(A + sa, lenA, B + sb, lenB);
        if (lenB <= 2)    return findMidMinor(B + sb, lenB, A + sa, lenA);

        //    Chop
        int chopLenA, chopLenB;
        double midA = findMidArr(A, sa, ea, chopLenA);
        double midB = findMidArr(B, sb, eb, chopLenB);
        int chopLen = std::min(chopLenA, chopLenB);

        if (midA == midB) return midA;
        else if (midA < midB)    return findMid(A, sa + chopLen, ea, B, sb, eb - chopLen);
        else if (midB < midA)    return findMid(A, sa, ea - chopLen, B, sb + chopLen, eb);
    }
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        return findMid(A, 0, m - 1, B, 0, n - 1);
    }
};

LeetCode "Median of Two Sorted Arrays",布布扣,bubuko.com

LeetCode "Median of Two Sorted Arrays"

原文:http://www.cnblogs.com/tonix/p/3926873.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!