LeetCode4俩有序数组的中位数-2020.03.28

声明:本内容只作为自己学习备注,会引用其他作者的题解,将会在开头标明来源,如有侵权请联系我删掉

4. 寻找两个有序数组的中位数

参考题解https://leetcode-cn.com/problems/median-of-two-sorted-arrays/comments/36497

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {

    int m = nums1.length;

    int n = nums2.length;

    int left = (m + n + 1) / 2;

    int right = (m + n + 2) / 2;

    return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;

}

//i: nums1的起始位置 j: nums2的起始位置

public static int findKth(int[] nums1, int i, int[] nums2, int j, int k){

    if( i >= nums1.length){

        return nums2[j + k - 1];//nums1为空数组

    }

    if( j >= nums2.length) {

        return nums1[i + k - 1];//nums2为空数组

    }

    if(k == 1){

        return Math.min(nums1[i], nums2[j]);

    }

    int midVal1=0,midVal2=0;

    if(i + k / 2 - 1 < nums1.length){

        midVal1= nums1[i + k / 2 - 1];

    }else{

        midVal1=Integer.MAX_VALUE;

    }

    if(j + k / 2 - 1 < nums2.length){

        midVal2=nums2[j + k / 2 - 1];

    }else{

      midVal2= Integer.MAX_VALUE;

    }

    if(midVal1 < midVal2){

        return findKth(nums1, i + k / 2, nums2, j , k - k / 2);

    }else{

        return findKth(nums1, i, nums2, j + k / 2 , k - k / 2);

    }

}

看题解(具体题解还是参见上面的链接)的时候不是很清晰,后来自己捋了一下调用过程,总算明白了。以下是笔记

① 说明arr1前k/2中一定没有要找的Kth元素,所以下次只需要看arr1剩余的k/2个元素即可

即 arr1,arr2合并后的有序数组中,Kth一定在arr1后k/2 或者arr2中。

而此时作为arr1,arr2合并后的有序数组,其前k/2个元素相当于已经在arr1中找到了,即arr1的前k/2个元素。

所以此时只需要找后k/2个元素就好了——在arr1剩下的元素和arr2剩下的元素中——即进入下一次递归

②找到俩有序数组合并后 第1th的元素

你可能感兴趣的:(LeetCode4俩有序数组的中位数-2020.03.28)