Leetcode Median of Two Sorted Arrays

时间:2023-02-05 12:22:25

题目地址:https://leetcode.com/problems/median-of-two-sorted-arrays/

题目解析:看到题目的第一个思路是用二分查找,但是深入下去后发现使用二分查找很多边界和细节方面的处理很麻烦,退而求其次,采用分治法。如果两个数组的长度和为偶数,则求两个数组的中间两个数的平均值;如果长度和为基数则求两个数组中间数即可。于是转化为一个更普遍的问题——求两个排序好的数组的第k个数,对于两个排序好的数组显然取第一个数组的前m个,第二个数组的前n个,保证m+n=k,比较第一个数组的第m个与第二个数组的第n个大小,若第一个数组的第m个大则去掉第一个数组的第m+1个之后的元素,以及第二个数组的前n个元素,查找剩下元素的k-m个元素即可。

题目解答:

public class Solution {
    public double findMedianSortedArrays(int A[], int B[]) {
        if(A.length == 0 || A == null){
            if(B.length == 0 || B == null){
                return 0;
            }else{
                return (B[B.length/2]+B[(B.length-1)/2])/2.0;
            }
        }else{
            if(B.length == 0 || B == null){
                return (A[A.length/2]+A[(A.length-1)/2])/2.0;
            }else{
                if((A.length + B.length)%2 == 0){
                    return (findKth(A,B,(A.length + B.length)/2,0,A.length-1,0,B.length-1)+
                        findKth(A,B,(A.length + B.length)/2-1,0,A.length-1,0,B.length-1))/2.0;
                }else{
                    return findKth(A,B,(A.length + B.length)/2,0,A.length-1,0,B.length-1);
                }
            }
        }
    }
    
    private int findKth(int[] A,int[] B,int k,int AStart,int AEnd,int BStart,int BEnd){
        int aLen = AEnd - AStart + 1;
        int bLen = BEnd - BStart + 1;
        
        if(aLen == 0){
            return B[BStart + k];
        }
        
        if(bLen == 0){
            return A[AStart + k];
        }
        
        if (k == 0)
            return A[AStart] < B[BStart] ? A[AStart] : B[BStart];
        
        int aMid = aLen*k/(aLen+bLen);
        int bMid = k - aMid - 1;
        
        aMid+=AStart;
        bMid+=BStart;
        
        if(A[aMid] == B[bMid]){
            return A[aMid];
        }else if(A[aMid] > B[bMid]){
            k = k - (bMid - BStart + 1);
            AEnd = aMid;
            BStart = bMid + 1;
        }else{
            k = k - (aMid - AStart + 1);
            BEnd = bMid;
            AStart = aMid + 1;
        }
        return findKth(A,B,k,AStart,AEnd,BStart,BEnd);
    }
}