package su.interview;
import utils.com.ArrayLister;
/**
* 给定两个有序数组,求中位数.
* @author Toy
*
*/
public class MiddleNum_01 {
/**
* 二者先合并成有序数组
* @param a
* @param b
* @return
*/
public void midnum_01(int[] a,int[] b){
System.out.println("method 1");
int alen=a.length;
int blen=b.length;
int[] c=new int[alen+blen];
int k=0;
int i=0;
int j=0;
while(i<alen&&j<blen){
if(a[i]<=b[j]){
c[k++]=a[i];
i++;
}else{
c[k++]=b[j];
j++;
}
}
while(i<alen){
c[k++]=a[i++];
}
while(j<blen){
c[k++]=b[j++];
}
ArrayLister.showArr(c);
if(k%2!=0){
System.out.println("mid num is: "+c[k/2]);
}else{
System.out.println("mid num are: "+c[k/2-1]+" "+c[k/2]);
}
}
/**
* 直接先根据长度确定中位数的顺序
* @param a
* @param b
*/
public void midnum_02(int[] a,int[] b){
System.out.println("method 2");
int alen=a.length;
int blen=b.length;
int[] mids=new int[]{0,0};
int pos=(alen+blen)/2;
int temp=0;
int i=0;
int j=0;
int k=0;//为即将插入的位置.
while(i<alen&&j<blen){
if(a[i]<=b[j]){
temp=a[i];
i++;
}else{
temp=b[j];
j++;
}
k++;
int state = checkK(pos,k-1,temp,mids);
if(state==2){
break;
}
}
while(i<alen){
temp=a[i];
i++;
k++;
int state = checkK(pos,k-1,temp,mids);
if(state==2){
break;
}
}
while(j<blen){
temp=b[j];
j++;
k++;
int state = checkK(pos,k-1,temp,mids);
if(state==2){
break;
}
}
if((alen+blen)%2==0){
System.out.println("mid num are: "+mids[0]+" "+mids[1]);
}else{
System.out.println("mid num is: "+mids[1]);
}
}
private int checkK(int pos, int k, int temp, int[] mids) {
// System.out.println(pos+" "+k+" "+temp);
if(k==pos-1){
mids[0]=temp;
return 1;
}
if(k==pos){
mids[1]=temp;
return 2;
}
if(mids[0]>0&&mids[1]>0){
return 2;
}
return 0;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a=new int[]{1,2,3,4,5,12,13};
int[] b=new int[]{6,7,8,9,10,29,30};
MiddleNum_01 m=new MiddleNum_01();
m.midnum_01(a, b);
m.midnum_02(a, b);
}
}
给定两个有序数组求他们的中位数
最新推荐文章于 2021-05-23 07:31:33 发布