在两个排序数组中找到第k小的数

这里写图片描述

//在两个排序数组中找到第k小的数
public class FindMinK{

   //(1)寻找上中位数的算法
    public static int getUpMedia(int[]arr1,int s1,int e1,int[]arr2,int s2,int e2){

          int mid1=0;
          int mid2=0;
          int offset=0;
          while(s1<e1){
             mid1=(s1+e1)/2;
             mid2=(s2+e2)/2;
             offset=((e1-s1+1)&1)^1;
             if(arr1[mid1]>arr2[mid2]){
                e1=mid1;
                s2=mid2+offset;
             }else if(arr1[mid1]<arr2[mid2]){
                s1=mid1+offset;
                e2=mid2;
             }else{
                return arr1[mid1];
             }
          }
          return Math.min(arr1[s1],arr2[s2]);
    }
   //(2)寻找篇排数组的第k小的数
    public static int FindMinKNum(int[]arr1,int[]arr2,int k){
          if(arr1==null||arr2==null){
            throw new RuntimeException("Your arr is invalid!");
          }
          if(k<1||k>(arr1.length+arr2.length)){
             throw new RuntimeException("K is invalid!");
          }
          int[]longs=arr1.length>=arr2.length?arr1:arr2; //较长的数组
          int[]shorts=arr1.length<arr2.length?arr1:arr2; //较短的数组
          int l=longs.length;
          int s=shorts.length;
          if(k<=s){
              return getUpMedia(shorts,0,k-1,longs,0,k-1);
          }
          if(k>l){
              if(shorts[k-l-1]>=longs[l-1]){
                return shorts[k-l-1];
              }
              if(longs[k-s-1]>=shorts[s-1]){
                return longs[k-s-1];
              }
              return getUpMedia(shorts,k-l,s-1,longs,k-s,l-1);
          }
          if(longs[k-s-1]>=shorts[s-1]){
             return longs[k-s-1];
          }
          return getUpMedia(shorts,0,s-1,longs,k-s,k-1);
    }
    public static void main(String[]args){

          //System.out.println("Hello");
         int[]arr1={1,2,3,4,5};
         int[]arr2={3,4,5};
         int k=1;
         while(k<=arr1.length+arr2.length)
         {
            System.out.println(FindMinKNum(arr1,arr2,k));
            ++k;
         }

    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值