题目连接:Leetcode 004 Median of Two Sorted Arrays
解题思路:对两个数组进行三分,直到有一个数组为空或者两个数组各剩一个数。
array1: a1_l, n1_l, a1_m, n1_r, a1_r
array2: a2_l, n2_l, a2_m, n2_r, a2_r
其中,n1_l、n1_r、n2_l、n2_r为一个数(n1_l 可能等于 n1_r,n2_l 可能等于 n2_r),其它的变量为数组(数组可能为空)。每次三分,比较 n1_l 和 n2_l,以及 n1_r 和 n2_r。
假设 n1_l < n2_l,n1_r < n2_r:那么我们将在 a1_l 和 a2_r 中删除n个数,这个 n 等于 a1_l 和 a2_r 数组的最小长度,n最小为1,这样保证三分不会进入死循环。
在三分结束时,有两种可能,一种是两个数组各剩一个数,那么中位数等于这个两个的平均值。另一种可能是一个数组为空,另一个数组还有若干数,此时直接对不为空的数组作二分即可。
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int s1 = 0, s2 = 0, e1 = nums1.size() - 1, e2 = nums2.size() - 1; int n1 = nums1.size(), n2 = nums2.size(); while (n1 != 0 && n2 != 0 && n1 + n2 > 2) { int d = ceil(min(n1, n2) / 3.0); int l1 = s1 + ceil(n1 / 3.0) - 1; int r1 = e1 - ceil(n1 / 3.0) + 1; int l2 = s2 + ceil(n2 / 3.0) - 1; int r2 = e2 - ceil(n2 / 3.0) + 1; if (nums1[l1] < nums2[l2]) { n1 -= d; s1 += d; } else { n2 -= d; s2 += d; } if (nums1[r1] < nums2[r2]) { n2 -= d; e2 -= d; } else { n1 -= d; e1 -= d; } } double ans = 0; if (n1 == 0) { int d = ceil(n2 / 2.0); ans = (nums2[s2 + d - 1] + nums2[e2 - d + 1]) / 2.0; } else if (n2 == 0) { int d = ceil(n1 / 2.0); ans = (nums1[s1 + d - 1] + nums1[e1 - d + 1]) / 2.0; } else { ans = (nums1[s1] + nums2[s2]) / 2.0; } return ans; } };