class Solution { public: /* 有序数组 中位数 二分查找 1.两个数组中间数相同,合并后,中位数一定是该数 2.arr1的中位数比arr2 的中位数小则 合并后,中位数一定在arr1的右区间和arr2 的左区间 3.同理arr2的中位数比arr1 的中位数小则 合并后,中位数一定在arr2的右区间和arr1的左区间 ps:当时数组长度为偶数时,需要对去除左区间的数组中位数指针移动一位,指向另外一半。 */ int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) { int n = arr1.size(); if(n == 0)return NULL; int l1 = 0, r1 = n - 1; int l2 = 0, r2 = n - 1; int mid1 = 0, mid2 = 0, even = 0; while(l1 < r1){ even = (r1 - l1)%2; // 是否是偶数个 mid1 = l1 + r1 >> 1; // arr1中位数 mid2 = l2 + r2 >> 1;// arr2中位数 if(arr1[mid1] == arr2[mid2]) return arr1[mid1]; // 两个数组中间数相同,合并后,中位数一定是该数 else if(arr1[mid1] < arr2[mid2]){ // arr1 中位数比 arr2小 l1 = mid1 + even; r2 = mid2; } else{ // arr2 中位数比 arr1小 l2 = mid2 + even; r1 = mid1; } } return min(arr1[l1], arr2[l2]); // 得到的两个数取中位数,即最小一个就是 } };