• 1000 на основе количества элементов меньше медианы должно быть меньше или равно (n + m + 1) /2.n и быть размером двух массивов соответственно. В случае четного числа элементов среднее берется со следующим элементом. Код выглядит следующим образом.
int n =A.size();
int m = B.size();
if(n < 1){
if(m%2==0){
return (B[m/2] + B[m/2-1])/2;
}else{
return B[m/2];
}
}else if(m < 1){
if(n%2==0){
return (A[n/2] + A[n/2-1])/2;
}else{
return A[n/2];
}
}
int lo = (A[0] < B[0] )? A[0] : B[0];
int hi = (A[n-1] > B[m-1] )? A[n-1] : B[m-1];
while(lo < hi){
int mid = lo + ( hi - lo+1)/2;
int t = 0;
t += upper_bound(A.begin() A.end() mid) - A.begin();
t += upper_bound(B.begin() B.end() mid) - B.begin();
if(t > ((n+m+1)/2) ) {
hi = mid-1;
}else{
lo = mid;
}
}
if( ((n+m)%2))
return lo;
else{
int ind1 = upper_bound(A.begin() A.end() lo) - A.begin();
int ind2 = upper_bound(B.begin() B.end() lo) - B.begin();
double nxt = ( A[ind1] < B[ind2] )? A[ind1] : B[ind2];
double x = lo;
return (x+nxt)/2;
}
Код дает неверный результат - это тестовый пример ниже: A = {-50, -41, -40, -19,5,21,28} B = { -50, -21, -10} Запуск dry помог мне понять, где что-то пошло не так, но я не могу понять, в чем заключается логическая ошибка в описанном выше подходе.