您的位置:首页 > 其它

二分查找——Median of two Sorted Arrays

2016-07-22 11:36 387 查看
本题为在两个排序数组中找第K大的数的一个特殊情况——第(A.length+B.length)/2大的数。

使用并归的思想逐个比较找出满足要求的数的时间复杂度为O(N)。

使用二分法比较A[K/2-1]和B[K/2-1],并思考这两个元素和第k大元素的关系。

1.A[K/2-1] <= B[K/2-1],A和B合并后的第K大数中必包含A[0]~A[k/2-1],可用归并的思想去理解。

2.若k/2-1超出了A的长度,则必取B[0]~B[k/2-1]。

接下来考虑特殊情况:

1.A,B都为空,或一个为空。

2.A+B的长度为偶数时返回len/2和len.2+1的均值,为奇数时返回len/2+1处的值。

3.findFunc利用了递归的方法,判断递归条件的判断非常重要:可以利用极端情况时的参数来入手,即看[ ]A.[ ]B,k谁先达到了极端的情况。

import java.util.*;
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if(A == null||B == null||(A.length == 0 && B.length == 0))
return 0;
int len=A.length+B.length;
if(len%2 == 0)
return (findFunc(A,B,0,0,len/2)+findFunc(A,B,0,0,len/2+1))/2.0;
else
return findFunc(A,B,0,0,len/2+1);
}
public int findFunc(int[] A,int[] B,int A_start,int B_start,int k)
{
if(A_start >= A.length)
return B[B_start+k-1];
if(B_start >= B.length)
return A[A_start+k-1];
if(1 == k)
return Math.min(A[A_start],B[B_start]);

int A_value=A_start+k/2-1 >= A.length?Integer.MAX_VALUE:A[A_start+k/2-1];
int B_value=B_start+k/2-1 >= B.length?Integer.MAX_VALUE:B[B_start+k/2-1];
if(A_value < B_value)

4000
return findFunc(A,B,A_start+k/2,B_start,k-k/2);
else
return findFunc(A,B,A_start,B_start+k/2,k-k/2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: