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;
}
}