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

给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数 [要求] 时间复杂度为O(logN)O(logN),额外空间复杂度为O(1)O(1) 例如:输入[1,2,3,4],[3,4,5,6],输出 3。总共有8个数,上中位数是第4小的数,所以返回3。

这个题目也是非常典型的二分法的变形题。

在B站有个视频讲解:

https://www.bilibili.com/video/BV1BA411N7oe/

因为两有序数组长度相等,所以递增序列长度一定为偶数,只需考虑一种情况即可;

import java.util.*;


public class Solution {
   /**
    * find median in two sorted array
    * @param arr1 int整型一维数组 the array1
    * @param arr2 int整型一维数组 the array2
    * @return int整型
    */
   public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {
       // write code here
       if(arr1.length == 1) return Math.min(arr1[0],arr2[0]);///特判
       int n = arr1.length;///数组长度
       int l1 = 0,r1 = n -1 ,l2 = 0,r2 = n -1;///初始指针
       ///元素个数位奇数,flag = 1,为偶数flag =0
       int flag = ((r1 - l1 + 1) & 1);
       while(l1 < r1){

           int mid1 = l1 + ((r1 - l1) >> 1);
           int mid2 = l2 + ((r2 - l2) >> 1);
           ///更新区域的个数,奇数,flag = 1,为偶数flag =0
           flag = ((r1 - l1 + 1) & 1);
           ///若两数组中位数相等,整体的中位数也是这个
           if(arr1[mid1] == arr2[mid2]) return arr1[mid1];
           else if(arr1[mid1] > arr2[mid2]){
               ///如果区域个数是奇数
               if(flag==1){
                   r1 = mid1;
                   l2 = mid2;
               }else{
               ///如果区域个数是偶数
                   r1 = mid1;
                   l2 = mid2 + 1;
               }

           }else{
               ///如果区域个数是奇数
               if(flag==1){
                   l1 = mid1;
                   r2 = mid2;

               }else{
                   ///如果区域个数是偶数
                   l1 = mid1 + 1;
                   r2 = mid2;
               }
           }

       }

       return Math.min(arr1[l1],arr2[l2]);

   }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵横千里,捭阖四方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值