Leetcode 004 Median of Two Sorted Arrays(三分)

题目连接: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;
		}
};


猜你喜欢

转载自blog.csdn.net/u011328934/article/details/80600650