median of two sorted arrays

后端 未结 10 624
南旧
南旧 2020-12-16 19:12

My question is with reference to Method 2 of this link. Here two equal length sorted arrays are given and we have to find the median of the two arrays merged.



        
10条回答
  •  甜味超标
    2020-12-16 19:43

    For variable length you just have to check the special cases when either of the array is having only 1 element in each level of recursion . If one of them such , don't divide further just pass it as it is till the other one also becomes of length 2. While giving final answer handle the case when one of them is having only 1 element.

        //Median of two sorted arrays
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
        public static void main (String[] args) throws java.lang.Exception {
            int[] A = {1, 3, 11};
            int[] B = {2, 4, 12, 14, 15};
            System.out.println("Ans. "+findMedian(A, B));
            //System.out.println(median(A));
        }
    
        private static int findMedian(int[] A, int[] B) {
            System.out.println(Arrays.toString(A)+" --- "+ Arrays.toString(B));
            int sA = A.length;
            int sB = B.length;
    
            if(sA <= 2 && sB <= 2) {
                if(sA <= 1 && sA <= 1) {
                    return (A[0]+B[0])/2; 
                } else if(sA <= 1) {
                    return (max(A[0], B[0]) + min(A[0], B[1])) / 2;
                } else if(sB <= 1) {
                    return (max(A[0], B[0]) + min(A[1], B[0]) ) / 2;
                } else {
                    System.out.println("xxx");
                    return (max(A[0], B[0]) + min(A[1],B[1])) / 2;
                }
            }
    
            int mA = median(A);
            int mB = median(B);
    
            if(mA == mB) {
                return mA;
            } else if(mA < mB) {
                if(sA <= 2) {
                    return findMedian(A, Arrays.copyOfRange(B, 0, sB/2+1));     
                } else if(sB <= 2) {
                    return findMedian(Arrays.copyOfRange(A, sA/2, sA), B); 
                } else {
                    return findMedian(Arrays.copyOfRange(A, sA/2, sA)
                              ,Arrays.copyOfRange(B, 0, sB/2+1)); 
                }
            } else {
                if(sA <= 2) {
                    return findMedian(A, Arrays.copyOfRange(B, sB/2, sB));  
                } else if(sB <= 2) {
                    return findMedian(Arrays.copyOfRange(A, 0, sA/2+1),B); 
                } else {
                    return findMedian(Arrays.copyOfRange(A, 0, sA/2+1)
                              ,Arrays.copyOfRange(B, sB/2, sB)); 
                }
            }
        }
    
        private static int median(int[] A) {
            int size = A.length;
            if(size == 0 ){
                return 0;
            } else if(size == 1) {
                return A[0];
            }
    
            if(size%2 == 0 ) {
                return (A[size/2 -1 ] + A[size/2  ])/2;
            }else {
                return A[size/2];
            }
        }
    
        private static int max(int a, int b) {
            return a > b ? a : b;
        }
    
        private static int min(int a, int b) {
            return a < b ? a : b;
        }
    }
    

提交回复
热议问题