classSolution { public: doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ int n = nums1.size(), m = nums2.size(); int total = n + m; int target1 = (total + 1) / 2, target2 = (total + 2) / 2; int i = 0, j = 0, cnt = 0; double median1 = 0, median2 = 0;
while (i < n || j < m) { int num; if (i < n && (j >= m || nums1[i] < nums2[j])) { num = nums1[i++]; } else { num = nums2[j++]; } cnt++; if (cnt == target1) { median1 = num; } if (cnt == target2) { median2 = num; break; } }
classSolution { public: doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ int m = nums1.size(), n = nums2.size(); function<int(int, int, int)> f = [&](int i, int j, int k) { if (i >= m) { return nums2[j + k - 1]; } if (j >= n) { return nums1[i + k - 1]; } if (k == 1) { returnmin(nums1[i], nums2[j]); } int p = k / 2; int x = i + p - 1 < m ? nums1[i + p - 1] : 1 << 30; int y = j + p - 1 < n ? nums2[j + p - 1] : 1 << 30; return x < y ? f(i + p, j, k - p) : f(i, j + p, k - p); }; int a = f(0, 0, (m + n + 1) / 2); int b = f(0, 0, (m + n + 2) / 2); return (a + b) / 2.0; } };
思路:两个升序数组求中位数,简化问题为求第 (m+n+1)/2 和第 (m+n+2)/2 个数的平均值,即找到两个正序序列的第 (m+n+1)/2 小的数和第 (m+n+2)/2 小的数。此时问题可归纳为:两个正序序列,如何找到第 k 小的数。二分法查找,每个数组中各取 k/2 的元素比较大小,较小部分的元素必然不是第 k 小的数,因此移动较小部分的指针,递归继续。