您的位置:首页 > 其它

寻找两个有序数组合并之后的中位数

2013-10-14 01:24 465 查看
public class Solution {
    public double findMedianSortedArrays(int A[], int B[]) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        double results = Double.MIN_VALUE;
        if(A!=null && B !=null) {
            int[] max;
            int[] min; 
            if (A.length > B.length) {
                max = A;
                min = B;
            }
            else {
                max = B;
                min = A;
            }
            int startMax = 0, endMax = max.length - 1;
            int startMin = 0, endMin = min.length - 1;
            int lengthMax=endMax - startMax + 1;
            int lengthMin = endMin - startMin + 1;
            int middleMin;
            int middleMax;
            while (lengthMin > 1){
                middleMin = (startMin + endMin) / 2;
                middleMax = (startMax + endMax) / 2;
                if (max[middleMax] < min[middleMin]) {
                    if ((lengthMin&1) == 0 && (lengthMax&1) == 0 
                    && ((min[middleMin]-max[middleMax])^(min[middleMin+1]-max[middleMax+1])) < 0){
                        return (min[middleMin]+min[middleMin+1])  / 2.0;//{1,4}{2,3}
                    }
                    else {
                        startMax = startMax + lengthMin / 2;
                        endMin = endMin - lengthMin / 2;
                    }
                }
                else if (max[middleMax] > min[middleMin]) {
                     if ((lengthMin&1)==0 && (lengthMax&1)==0 
                     && ((min[middleMin]-max[middleMax])^(min[middleMin+1]-max[middleMax+1])) < 0){
                        return (max[middleMax]+max[middleMax+1])/2.0;
                     }
                     else {
                        endMax = endMax - lengthMin/2;
                        startMin = startMin + lengthMin / 2;
                     }
                }
                else {
                    if((lengthMin&1)==0 && (lengthMax&1)==0) {
                            results = (max[middleMax + 1]>min[middleMin + 1])
                            ? (max[middleMax] + min[middleMin + 1])/2.0
                            : (max[middleMax] + max[middleMax + 1])/2.0;
                            //{1,2}{1,3}
                    }
                    else {
                        results = (max[middleMax] + min[middleMin])/2.0;
                    }
                    return results;
                }
                lengthMax = endMax - startMax + 1;
                lengthMin = endMin - startMin + 1;
            }
            //在不断删除数字当min=1时
            if(lengthMin == 1 && lengthMax > 1) {
                //说明max为奇树
                int mid = (startMax + endMax) /2;
                if((lengthMax&1) == 1) {//max为奇树,所以应该是两位数字之和,max的两位中位数和min的一位数字之间选2
                    if(min[startMin] < max[mid - 1]){results = (max[mid] + max[mid-1])/2.0;}
                    else if(min[startMin] > max[mid + 1]){results = (max[mid] + max[mid+1])/2.0;}
                    else {results = (max[mid] + min[startMin])/2.0;}
                }
                else{//max为偶数,所以应该是max的俩位中位数和min的一位中的一位
                    if (min[startMin] < max[mid]) {results = max[mid];}
                    else if (min[startMin] > max[mid + 1]){results = max[mid + 1];}
                    else {results = min[startMin];}
                }
            }
            else if (lengthMin == 1 && lengthMax == 1) {//如果最后max,min都只有1
                results = (min[startMin] + max[startMax])/2.0;
            }
            else if (lengthMin == 0 && lengthMax > 0) {//min为[]的情况,如果
                int mid = (startMax + endMax)/2;
                if((lengthMax&1) == 1) {    results = max[mid];}
                else{    results = (max[mid] + max[mid+1])/2.0;}
            }
        }
        return results;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: