寻找两个有序数组合并之后的中位数
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; } }
相关文章推荐