leetcode刷题记录五

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Viscu/article/details/82154589
1.median-of-two-sorted-arrays

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

思路:两个数组找中位数我们可以转化成为找第k小。
我们首先找两个数组合起来的第k小,就是分别找两个数组分开的第k/2小。
假设两个数组是一样长的,那么就拿A[ast+k-1]与B[bst+k-1]比较,
如果A[ast+k-1]<B[bst+k-1]的话,那么A数组的第k/2小就不在ast~ast+k/2-1之间。
class _109{
    public static final int inf=0x7FFFFFF;
    public double findMedianSortedArrays(int A[], int B[]){
        int total=A.length+B.length;
        int t=total&1;
        if(t==1){ //奇数个
            return getKth(A,0,B,0,total/2+1); //奇数个个直接找第k小
        }else{ //偶数个
            return (getKth(A,0,B,0,total/2)+getKth(A,0,B,0,total/2+1))/2;//偶数个找第k小和第k+1小
        }
    }
    public double getKth(int A[],int ast,int B[],int bst,int k){
        if(ast>=A.length){ //超出范围说明A数组上已经不存在第k/2小的数了,那么答案就是b数组第k小的数。
            return B[bst+k-1]; //第k/2是建立在两个数组都有数的情况下的,若只是一个数组,那么就是第k小
        } //例如 {} {1,2,3}
        if(bst>=B.length){ //同上
            return A[ast+k-1];
        }
        if(k==1){ //如果为1,直接返回a,b数组ast,bst上的较小的值,临界
            return Math.min(A[ast],B[bst]);
        }
        int aMid = inf,bMid = inf; //注意初始值
        if(ast+k/2-1<A.length){ //找数组第k/2小的值进行比较
            aMid=A[ast+k/2-1];
        }
        if(bst+k/2-1<B.length){
            bMid=B[bst+k/2-1];
        }
        if(aMid<bMid){
            return getKth(A,ast+k/2,B,bst,k-k/2); //舍弃a数组ast~ast+k/2-1部分
        }else{
            return getKth(A,ast,B,bst+k/2,k-k/2); //舍弃b数组bst~bst+k/2-1部分
        }
    }
    public static void main(String[] args) {
        int[] a={};
        int[] b={1};
        System.out.println(new _109().findMedianSortedArrays(a,b));
    }
}

猜你喜欢

转载自blog.csdn.net/Viscu/article/details/82154589
今日推荐