题解 | 多数组中位数
多数组中位数
https://www.nowcoder.com/practice/b6bb0bce88894108bfc23e9b7b012420
#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]); //下边界 } };