算法总结之 在两个长度相等的排序数组中找到上中位数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法总结之 在两个长度相等的排序数组中找到上中位数相关的知识,希望对你有一定的参考价值。

题目描述: arr1  和 arr2   长度都为N   求两个数组中所有数的上中位数

要求 时间复杂度 O(logN)  额外空间复杂度O(1)

这道题目的方法比较好玩:

   这两个数组如下表示:

 arr1[start1....end1]     arr2[start2...end2]

如果start1==start2  那么也有start2==end2   此时元素总个数是2个,上中位数为最小的那个  

如果start1!=start2  令mid1={start1+end1}/2      mid1={start2+end2}/2

     进而分情况

                             情况一、 如果arr1[mid1] == arr2[mid2]

                                                    如果两个数组长度为奇数或者偶数,那么arr1[mid1] == arr2[mid2]=上中位数

                             情况二、如果arr1[mid1] >arr2[mid2]

                                                   如果长度为奇数、(假设为5)arr1的第三个数>arr2的第三个数  此时上中位数只能是从arr1的{1,2,3}和arr2的{3,4,5}的共同的上中位数找 

                                                   如果长度为偶数,(假设为4)arr1的第二个数>arr2的第二个数  此时上中位数只能是从arr1的{1,2}和arr2的{3,4}的共同的上中位数找 

                                          如果arr1[mid1] <arr2[mid2]情况完全一致  请读者自行推理

 

废话不多说,上代码:

package TT;

public class Test12 {

    public  static int getUpMedian(int[] arr1 , int[] arr2){
        
        if(arr1==null || arr2==null || arr1.length != arr2.length){
            throw new RuntimeException("hi,babay.are you ok?");
        }
        
        int start1 =0;
        int end1 = arr1.length-1;
        
        int start2=0;
        int end2 = arr2.length-1;
        
        int mid1 =0;
        int mid2 =0;
        
        int offset = 0;
        
        
        while(start1 < end1){
            mid1 = (start1+end1)/2;
            mid2 = (start2+end2)/2;
            
            offset = ((end1 - start1+1)&1)^1;
            if(arr1[mid1] > arr2[mid2]){
                end1 = mid1;
                start2=mid2+offset;
            }else if(arr1[mid1]<arr2[mid2]){
                start1 = mid1 + offset;
                end2 = mid2;
            
            }else {
                return arr1[mid1];
            }
            
            
        }
        
        return Math.min(arr1[start1], arr2[start2]);
        
        
    }
    
    
    
    public static void main(String[] args){
        
           int[] a1 = new int[4];
           int[] a2 = new int[4];
           
          a1[0]=0;  a1[1]=1;  a1[2]=2; a1[3]=3;
          a2[0]=4;  a2[1]=5;  a2[2]=5; a2[3]=6;
        
          
          int c = getUpMedian(a1,a2);
          
          System.out.println(c);
        
        
    }
    
    
    
    
    
    
    
    
    
    
    
}

结果:

技术分享

 

以上是关于算法总结之 在两个长度相等的排序数组中找到上中位数的主要内容,如果未能解决你的问题,请参考以下文章

递归打卡1在两个长度相等的排序数组中找到上中位数

递归训练1:在两个?长度相等的排序数组中找到上中位数

数字问题4:在两个长度相等的数组中找上位数

2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是多少? 中位数的定义为上中位数, [1,

排序算法总结之归并排序

两个不同长度的排序数组的中位数