class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * find median in two sorted array * @param arr1 int整型vector the array1 * @param arr2 int整型vector the array2 * @return int整型 */ int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) { // write code here // 直接挑战进阶版本的时间和空间复杂度,这个时间复杂度只能靠二分了 // 如果最开始的数编号就是 1 // 仔细看题目,两个数组长度都是 N,上中位数就是两个数组合并且排序之后第 N 个数 // 不要直接合并数组,有索引就够了 // 二分的话设置左右边界,然后在 arr1 里设置一个 cut1, // arr2 里设置一个 cut2 = N - cut1,这样保证这两个下标左边的数正好是 N 个 // 找上中位数的话肯定不小于左边的数,不大于右边的数,这个就是我们调整 cut1 的条件 int n = arr1.size(); int low = 0, high = n; while (low < high) { int cut1 = (low + high) / 2; int cut2 = n - cut1; int left1 = (cut1 == 0) ? INT_MIN : arr1[cut1 - 1]; int left2 = (cut2 == 0) ? INT_MIN : arr2[cut2 - 1]; int right1 = (cut1 == n) ? INT_MAX : arr1[cut1]; int right2 = (cut2 == n) ? INT_MAX : arr2[cut2]; if (left1 <= right2 && left2 <= right1) { // C++ 数组最开始编号是 0,按照定义是 n - 1 这个位置是上中位数 return max(left1, left2); } else if (left1 > right2) { // cut1 位置靠右了,往左边调一点 high = cut1; cout << "high = " << high << endl; } else { // cut1 位置靠左了,往右边调一点 low = cut1 + 1; cout << "low = " << low << endl; } } // 上面的代码在处理诸如 [1,2],[3,4] 这样两个数组直接拼一起都是递增的输入会有问题, // low 一直加加到和 n 一样大也没办法满足 left1 <= right2 && left2 <= right1 if (low == n) return arr1[n - 1]; // 只是为了让函数编译通过,通常来说不会在这里 return,不然就是前面代码写的有问题 return -1; } };