您的位置:首页 > 其它

求两个有序数组的中位数

2015-08-19 19:37 375 查看

1 题目

There are two sorted arrays nums1 and nums2 of size m and
n respectively. Find themedian of the two sorted arrays. The overall run time complexity should beO(log (m+n)).

2 分析

若m+n为奇数则中位数(median)排好序后的中间值,若为偶数则中位数只的是中间两个数的平均值。

题目中要求时间复杂度为O(log(m+n)),显然可以用分治的思想求解。

3 实现

int findKth(vector<int> &num1, int begin1, int end1, vector<int> &num2, int begin2, int end2, int k);
double Solution::findMedianSortedArrays(vector<int> &num1, vector<int> &num2)
{
	int m = num1.size();
	int n = num2.size();
	if ((m + n) & 0x1)
	{
		return findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2);
	}
	else
	{
		return (findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2 - 1) + 
			findKth(num1, 0, m - 1, num2, 0, n - 1, (m + n) / 2)) / 2.0;
	}
}

int findKth(vector<int> &num1, int begin1, int end1, vector<int> &num2, int begin2, int end2, int k)
{
	int m = end1 - begin1 + 1;
	int n = end2 - begin2 + 1;
	if (m > n)
	{
		return findKth(num2, begin2, end2, num1, begin1, end1, k);
	}

	if (0 == m)
	{
		return num2[begin2 + k];
	}
	if (0 == k)
	{
		return min(num1[begin1], num2[begin2]);
	}

	int middle1 = min((begin1 + end1) / 2, k + begin1);
	int middle2 = begin2 + (k - (middle1 - begin1 + 1));

	if (middle2 < begin2)
	{
		++middle2;
		--middle1;
	}

	if (num1[middle1] < num2[middle2])
	{
		return findKth(num1, middle1 + 1, end1, num2, begin2, end2, k - (middle1 - begin1 + 1));
	}
	else if (num1[middle1] > num2[middle2])
	{
		return findKth(num1, begin1, end1, num2, middle2 + 1, end2, k - (middle2 - begin2 + 1));
	}
	else
	{
		return num1[middle1];
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: