找两个有序数组的中位数,是一道LeetCode上面的面试题。要解这道题,首先要弄清楚规则,具体可以参考https://leetcode.com/problems/median-of-two-sorted-arrays/solution/上面的分析。这里,先保证第一个数组的长度小于第二个数组的长度,然后按照规则保证左半部分最大的数小于右半部分最小的数。
在找到了合适的index后,还需要考虑两个数组的长度之和的奇偶情况,从而决定返回数的值。
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
if (m > n) { // to ensure m<=n
vector<int>temp(nums1);
nums1.assign(nums2.begin(), nums2.end());
nums2.assign(temp.begin(), temp.end());
int tmp = m; m = n; n = tmp;
}
int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
if (i < iMax && nums2[j-1] > nums1[i]){
iMin = iMin + 1; // i is too small
}
else if (i > iMin && nums1[i-1] > nums2[j]) {
iMax = iMax - 1; // i is too big
}
else {
int maxLeft = 0;
if (i == 0) { maxLeft = nums2[j-1]; }
else if (j == 0) { maxLeft = nums1[i-1]; }
else { maxLeft = max(nums1[i-1], nums2[j-1]); }
if ( (m + n) % 2 == 1 ) { return maxLeft; }
int minRight = 0;
if (i == m) { minRight = nums2[j]; }
else if (j == n) { minRight = nums1[i]; }
else { minRight = min(nums2[j], nums1[i]); }
return (maxLeft + minRight) / 2.0;
}
}
return 0.0;
}