一、两有序数组第k大的数
public static int topk(int[] a,int[] b,int alen, int blen, int k) { if(alen==0) { return b[b.length-blen+k-1]; } if(blen==0) { return a[a.length-alen+k-1]; } if(k==1) { return a[a.length-alen]<b[b.length-blen]?a[a.length-alen]:b[b.length-blen]; } int amin = alen>k/2?k/2:alen; int bmin = blen>k/2?k/2:blen; if(a[a.length-alen+amin-1] < b[b.length-blen+bmin-1]) { k = k - amin; alen = alen - amin; return topk(a,b,alen,blen,k); }else if(a[a.length-alen+amin-1] > b[b.length-blen+bmin-1]){ k = k - bmin; blen = blen - bmin; return topk(a,b,alen,blen,k); }else { k = k - amin - bmin; if(k == 0) { return a[a.length-alen+amin-1]; } alen = alen - amin; blen = blen - bmin; return topk(a,b,alen,blen,k); } }
下面这种可能好理解,但是性能就会比较差
public static int topk(int[] a,int[] b, int k) { int alen = a.length; int blen = b.length; if(alen==0) { return b[k-1]; } if(blen==0) { return a[k-1]; } if(k==1) { return a[0]<b[0]?a[0]:b[0]; } int amin = alen>k/2?k/2:alen; int bmin = blen>k/2?k/2:blen; int[] newa = null; int[] newb = null; if(a[amin-1] < b[bmin-1]) { k = k - amin; alen = alen - amin; newa = Arrays.copyOfRange(a, a.length-alen, a.length); newb = Arrays.copyOfRange(b, b.length-blen, b.length); return topk(newa,newb,k); }else if(a[amin-1] > b[bmin-1]){ k = k - bmin; blen = blen - bmin; newa = Arrays.copyOfRange(a, a.length-alen, a.length); newb = Arrays.copyOfRange(b, b.length-blen, b.length); return topk(newa,newb,k); }else { k = k - amin - bmin; if(k == 0) { return a[amin-1]; } alen = alen - amin; blen = blen - bmin; newa = Arrays.copyOfRange(a, a.length-alen, a.length); newb = Arrays.copyOfRange(b, b.length-blen, b.length); return topk(newa,newb,k); } }