面试:数组:两数组中的中序数

题目

两个有序的数组A和B,分别拥有m和n长度,求合并后的第k个数

算法

二分查找O(lgN)

import java.util.*;

class Solution{
    private double findkthSortedArrays(int[] A,int astart,int aend,int[] B,int bstart,int bend,int k){

        int m=aend-astart,n=bend-bstart;
        if(m<n)
            return findkthSortedArrays(B,bstart,bend,A,astart,aend,k);
        if(n==0)
            return A[astart+k-1];
        if(n==1)
            return Math.min(A[astart],B[bstart]);

        int pb=Math.min(k/2,n),pa=k-pb;

        if(A[astart+pa-1]>B[bstart+pa-1])
            return findkthSortedArrays(A,astart,aend,B,bstart+pb,bend,k-pb);
        else if(A[astart+pa-1]<B[bstart+pa-1])
            return findkthSortedArrays(A,astart+pa,aend,B,bstart,bend,k-pa);
        else
            return A[astart+pa-1];

    }

    public double findMedianSortedArrays(int[] A,int[] B){
        int m=A.length,n=B.length;
        if((n+m)%2==1)
            return findkthSortedArrays(A,0,m,B,0,n,(n+m)/2+1);
        else
            return (findkthSortedArrays(A,0,m,B,0,n,(n+m)/2+1)+
                    findkthSortedArrays(A,0,m,B,0,n,(n+m)/2))/2.0;
    }

    public static void main(String[] args){
        Scanner cin=new Scanner(System.in);
        Solution s=new Solution();
        int[] A={1,2,4};
        int[] B={3,5,6};
        System.out.println(s.findMedianSortedArrays(A, B));
    }
}

你可能感兴趣的:(面试:数组:两数组中的中序数)