#include <climits>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr1 int整型vector
* @param arr2 int整型vector
* @return int整型
*/
int getUpMedian(vector<int>& arr1, vector<int>& arr2) {
//把两个数组都左右分,左边的数都小于右边的数,也就是左边的两个边界数要小于右边的边界数
int n1 = arr1.size();
int n2 = arr2.size();
int alllen = n1+n2;
int leftlen = (alllen + 1)/2; //左边的数多一个
if(n2 < n1){
swap(arr1, arr2); //让arr1是数量小的那个数;
swap(n2, n1); //让n1是小的数组长度;
}
int L = -1, R = n1;
while(L < R){
int mid = (L+R)/2; //mid作为第一个数组的左边界下标
int l2 = leftlen - mid - 2; //3-0-2 = 1; 得到左边界下标
int left_1 = ( mid== -1 )? INT_MIN : arr1[mid]; //再考虑越界问题,将越界的下标设置成max和min取不到的值,右边界取max,所以INT_min取不到;
int right_1 = ( mid == n1-1 )? INT_MAX: arr1[mid+1];
int left_2 = ( l2 == -1 )? INT_MIN: arr2[l2];
int right_2 = ( l2 == n2-1) ? INT_MAX: arr2[l2+1];
if( left_1 > right_2 ){
R = mid;
continue;
}
if( left_2 > right_1 ){
L = mid;
continue;
}
L = mid; //最后L是我们要的数
break;
}
return max(arr1[L], arr2[leftlen -L -2]); //下边界
}
};