LeetCode Median of Two Sorted Arrays

本文介绍了一种高效算法,用于找出两个已排序数组的中位数。通过递归地将问题分解为查找第k小元素的问题,该算法能够在O(log(min(m, n)))的时间复杂度内找到答案,其中m和n分别是两个数组的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/zcsylj/article/details/6802062这篇博客上的想法是错的。

虽说在优化思想上是对的,但其对median的理解就是错的,判断时要判断中位数是否想等,而不是只是简单的除2.我的思路是对的,但是这么做的话,很复杂。因为用中位数来判断是否相等,还要对中位数取整用作索引,最麻烦的是要不断改两个数组的起始索引和结束索引。

下面的方法,从最小k的角度进行分析,代码为证,真是漂亮。http://blog.youkuaiyun.com/yutianzuijin/article/details/11499917

double findKth(int a[], int m, int b[], int n, int k)
{
	//always assume that m is equal or smaller than n
	if (m > n)
		return findKth(b, n, a, m, k);
	if (m == 0)
		return b[k - 1];
	if (k == 1)
		return min(a[0], b[0]);
	//divide k into two parts
	int pa = min(k / 2, m), pb = k - pa;
	if (a[pa - 1] < b[pb - 1])
		return findKth(a + pa, m - pa, b, n, k - pa);
	else if (a[pa - 1] > b[pb - 1])
		return findKth(a, m, b + pb, n - pb, k - pb);
	else
		return a[pa - 1];
}

class Solution
{
public:
	double findMedianSortedArrays(int A[], int m, int B[], int n)
	{
		int total = m + n;
		if (total & 0x1)
			return findKth(A, m, B, n, total / 2 + 1);
		else
			return (findKth(A, m, B, n, total / 2)
					+ findKth(A, m, B, n, total / 2 + 1)) / 2;
	}
};
这样的代码我是想不出来,写不出来,看了半天才看懂。若是能记住我也就算是没白看。我以为得用两个索引呢,一个起始索引,一个结束索引;我也没想到考虑保证m一定小于n,没考虑k/2和m的关系。为什么用第k小的数就可以更简单些,就是因为第k小k是整数,不是median,不用取整并且作为索引。参数传递的一个是首地址,一个是长度,后面子递归程序改变的依然是当前的首地址和长度。当A数组长度小于k/2时,B数组长度一定大于k/2(否则的话第k小不存在),此时pb为什么为k-pa?其实此时pb完全可以是k/2的,之所以是k-pa是为了当B[pb-1]<A[pa-1]时,能多排除一些值,这样其实所有小于pb 都可以排除了(因为这些都是小于第k大的)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值