我们有两个有序数组,A[1+n],B[1+n],下标从1开始。
logn显然就是二分折半。
设la=1,ra=n,lb=1,rb=n;
mida=(la+ra)/2,midb=(lb+rb)/2;
我们只需要遵循以下几个原则即可:
1、当mida+midb=k时,必然就是答案。
ans=max(mida,midb);为什么呢?
在两个数组中,从小到大,若mida小,那么必然可以全部插入到midb之前,所以midb就是第k小。
2、当mida+midb>k,则大数(max(mida,midb))往左压缩.
因为:往左压的过程,我们要保证都是小的数,如果选小的数往左压,那么必然会出现,小数这组还有更小的数,那么找到的第k个数就不是真正的第k小的数。因为还有更小的数可以插入进来。
3、当mida+midb<k,则小数(min(mida,midb))往右扩张.
伪代码:
while((mida+midb)!=k){
if (mida+midb)>k//含有的数大于k个,往前折半
if(A[mida]>=B[midb]) ra=mida,mida=(la+ra)/2;
else rb=midb,midb=(lb+rb)/2;
else//含有的数小于k个,往后折半
if(A[mida]<=B[midb]) la=mida,mida=(la+ra);
else lb=midb,midb=(lb+rb);
}
int ans <--- max(A[mida],B[midb]);//退出循环,正好第k个,去最大的。