找到两个排序数组的中位数
程序员文章站
2022-04-25 14:31:02
...
//找到两个排序数组的中位数
public class GetMedianTwoArr{
//k为中位数的位置
public static 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 Math.min(a[0], b[0]);
//divide k into two parts
int pa = Math.min(k / 2, m), pb = k - pa;
if (a[pa - 1] < b[pb - 1])
{
int[]str=new int[a.length-pa+1];
for(int i=pa;i<a.length;i++)
{
str[i-pa]=a[i];
}
return findKth(str, m - pa, b, n, k - pa);
}
else if (a[pa - 1] > b[pb - 1])
{
int[]str2=new int[b.length-pb+1];
for(int i=pb;i<b.length;i++)
{
str2[i-pb]=b[i];
}
return findKth(a, m, str2, n - pb, k - pb);
}
else
return a[pa - 1];
}
public static double findMedianSortedArrays(int A[], int m, int B[], int n)
{
int total = m + n;
//若为奇数
if ((total&1)>0)
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;
}
public static void main(String[]args)
{
int[]A={1,2,3};
int[]B={3,4};
int m=A.length;
int n=B.length;
System.out.println(findMedianSortedArrays(A,m,B,n));
}
}
上一篇: css实现垂直方向上的居中方式