不明白 哈哈 但用手画一画 就是这个规律:
题解二:二分
题解思路:首先两个数组都为N且有序,那么两个数组中间值两边数的个数是相同(长度为奇数)的或者一边多一个(长度为偶数),所以要考虑长度的奇偶。
用mid1表示arr1中值index,mid2表示arr2中值index

长度为奇数
①arr1[mid1] > arr2[mid2]
arr1[mid1] 肯定大于 arr2[0:mid2) , arr2[mid2] 肯定小于 arr1(mid1:right] , 且 arr2[0:mid2) 与 arr1 (mid1:right] 长度相同,所以要是将 arr1 与 arr2 合并看出一个大数组,它们位于这个数组的两端。
所以中位数肯定在 arr1[0:mid1] 和 arr2[mid2:right] 中;
②arr1[mid1] < arr2[mid2]
同理: 中位数在 arr1[mid1:right] 与 arr2[0:mid2] 中;
③arr1[mid1] == arr2[mid2]
表明找到中位数。
长度为偶数
①arr1[mid1] > arr2[mid2]:
这时如果向下取整,对于 arr(mid:right] 长度要比 arr[0:mid) 多一个数;
所以 arr1 会比 arr2 多缩减一个数,因此中位数在 arr1[0:mid1] 与 arr2[mid2+1,right] 中;
②arr1[mid1] < arr2[mid2]:
同理: 中位数在 arr1[mid1+1,right] 与 arr2[0:mid2];
③ arr1[mid1] = arr2[mid2]
表明找到中位数。
图示:
图片说明

复杂度分析:
时间复杂度: : 每次都缩减一半的范围
空间复杂度: : 没有申请额外空间

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) {

        if(arr1.length == 1) {
            return Math.min(arr1[0],arr2[0]);
        }

        int left1 = 0;
        int right1 = arr1.length -1;

        int left2 = 0;
        int right2 = arr2.length -1;

        while (left1 < right1) {

            int mid1 = left1 + (right1 - left1) / 2;
            int mid2 = left2 + (right2 - left2) / 2;

            //如果是偶数,那么有一个arr多缩减了一个数 注意:这里不能写成int jiOu = (arr1.length % 2 == 0 ? 1 : 0); 因为每次2分后 数组左右指针都是变化的 可能一会是奇数 一会是偶数
            int jiOu = ((right1 - left1 + 1) % 2 == 0 ? 1 : 0);

            //相等表明找到中位数
            if (arr1[mid1] == arr2[mid2]) {
                return arr1[mid1];
            } else if (arr1[mid1] > arr2[mid2]) {
                //判断是不是要多一移一位,偶数需要  arr2[mid2+cr: right2] ---arr1[0:mid1]
                left2 = mid2 + jiOu;
                right1 = mid1;
            } else {
                //arr1[mid1+cr: right1] ---arr2[0:mid2]
                left1 = mid1 + jiOu;
                right2 = mid2;
            }
        }

        //若两数组中位数不相等,最后返回最小的为上中位数
        return Math.min(arr1[left1], arr2[left2]);
    }
}