Median of Two Sorted Arrays

本文介绍了一种在两个有序数组中查找中位数的方法,通过递归地缩小搜索范围来降低复杂度,整体运行时间复杂度为O(log(m+n))。文章详细解释了如何比较两个数组中的元素,并据此调整搜索范围。

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

题目原型:

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

基本思路:

借助找第K个数的思想,大概意思就是在两个有序数组中,分别在第一个数组和第二个数组中找到第k个数,有三种情况:

A[k/2-1] = B[k/2-1]
A[k/2-1] > B[k/2-1]
A[k/2-1] < B[k/2-1]

第一种情况直接返回第k大的数,第二种请况是把B[0]到B[k/2-1]这k/2个数选中,表示这k/2个数在前k个最小的数之列。为什么呢?等会证明。然后从A[k/2]-A[M]和A[0]-A[N]中选取后k/2个数,以此类推。第三种情况类似。考虑的时候要注意数组长度的奇偶性。

好,现在我们证明下上面的情况,为什么说当A[k/2-1] > B[k/2-1]时我们要把B[0]到B[k/2-1]这k/2个数选中选中?想想,在B数组中有k/2-1个数比B[k/2-1]小,而A[k/2-1] > B[k/2-1],那么在A数组中至多有k/2-1个数比B[k/2-1]小,说明两个数组中最多有k/2+k/2-2个数比B[k/2-1]小,说明B[k/2-1]顶多排在第k/2+k/2-2+1<=k(不管是奇数还是偶数),所以所以B[0]到B[k/2-1]这k/2个数肯定比第K大的数小。

	public double findMedianSortedArrays(int A[], int B[])
	{
		int m,n;
		//边界条件的判断
		if(A==null||A.length==0)
			m = 0;
		else
			m  = A.length;
		if(B==null||B.length==0)
			n = 0;
		else
			n = B.length;
		//两个数组长度和为奇数
		if(((m+n)&0x1)==1)
		{
			return findMedianSortedArrays(A, 0, 0, B, (m+n)/2+1,m,n);
		}
		//两个数组长度和为偶数,则要去中位数
		else
			return (findMedianSortedArrays(A, 0, 0, B, (m+n)/2,m,n)+findMedianSortedArrays(A, 0, 0, B, (m+n)/2+1,m,n))/2;
	}
	/**
	 * 
	 * @param A 数组A
	 * @param startA 数组A的起始位置
	 * @param startB 数组B的起始位置
	 * @param B  数组B
	 * @param k 找第K个数时,还剩多少个数找。比如说我们要找中间数,第一次找出了k/2个数,那么接下来我们要找的数还剩k-k/2=k/2个
	 * @param m 数组A还剩下的长度
	 * @param n 数组B还剩下的长度
	 * @return
	 */
	public double findMedianSortedArrays(int A[], int startA,int startB,int B[],int k,int m , int n)
	{
		if(m>n)
			return findMedianSortedArrays(B, startB, startA, A, k,n,m);
		if(m==0)
			return B[k-1];
		if(k==1)
			return Math.min(A[startA], B[startB]);
		int indexA = startA+Math.min(k/2, m);
		int indexB = startB+k - Math.min(k/2, m);
		if(A[indexA-1]<B[indexB-1])
			return findMedianSortedArrays(A,indexA,startB,B,k-Math.min(k/2, m),A.length-indexA,n);
		else if(A[indexA-1]>B[indexB-1])
			return findMedianSortedArrays(A,startA,indexB, B,Math.min(k/2, m),m,B.length-indexB);
		else
			return A[indexA-1];
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值