您的位置:首页 > 其它

leetcode media of an sort array

2014-04-08 23:25 357 查看
本题要求时间复杂度为log(m+n),不让合并用额外的空间:

算法描述:

1 选定两个数组A,B并计算长度,根据长度和m+n是偶数还是奇数,分为两种查找中位的方式;

如果和为偶数:Value[(m+n)/2]+Value[(m+n)/2+1]

如果为奇数:Value[(m+n)/2]

2 然后通过迭代计算中位数

通过假定A长度小于B,然后选择每个数组的中间k/2元素,如果A的中位数,小于B的中位数,则A中位数前面的元素都小于value(k),这样重新选择A的起始点,并减去k值为k-pa;如果,B中的小,这让B的长度减去pb,然后重新开始;

重视让A的长度小于B的长度;

k每次递减,m,n分别表示数组剩余长度;index1,index2分别表示前面去掉的元素个数;

注意:边界问题:

如果k为1:表示从新起始的元素开始的A,B第一个元素的较小值

如果m为0;表示较小长度的数组已经分析完了,直接选择第二个数组制定位置的元素就可以

package com.demo.acm;

public class MedianOfTwo {

private double findKth(int[] a,int m,int[] b,int n,int k,int index1,int index2){
//System.out.println("m:"+m+" n:"+n+" k:"+k+" index1:"+index1+" index2:"+index2);
if(m>n){
return findKth(b,n,a,m,k,index2,index1);
}
if(m==0){
//System.out.println("*");
return b[index2+k-1];
}

if(k==1){
//System.out.println("-"+index1+" "+index2);
return Math.min(a[index1],b[index2]);
}

int pa=Math.min(k/2, m),pb=k-pa;
if(a[index1+pa-1]<b[index2+pb-1]){
return findKth(a,m-pa,b,n,k-pa,pa+index1,index2);
}else if(a[index1+pa-1]>b[index2+pb-1]){
return findKth(a,m,b,n-pb,k-pb,index1,index2+pb);
}else{
return a[index1+pa-1];
}
}

public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;
int n = B.length;
int total = m + n;
//System.out.println("A:"+A.length+" B:"+B.length);
if ((total & 1) == 0) {
return (findKth(A, m, B, n, total / 2,0,0) + findKth(A, m, B, n,
total / 2 + 1,0,0)) / 2;
} else {
return findKth(A, m, B, n, total / 2 + 1,0,0);
}
}
public static void main(String[] args){
MedianOfTwo media=new MedianOfTwo();
int[] A={1};
int[] B={5,6,7};
System.out.println(media.findMedianSortedArrays(B, A));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: