求两个有序数组的中位数

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];
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值