Leetcode No.4两个排序数组的中位数

2020-12-28 19:35

阅读:419

两个有序数组的中位数

首先明确思路 这题的解法我们可以采用一种递归的思想来解决问题 求他们的中位数,可以看成求这两个数组的合集的第k小的数
当 k = 1时,返回两个数组第一个值中的最小值即可
对于数组nums1,nums2,比较他们的第k / 2个数
nums1: a1,a2,...a(k / 2)..an
nums2: b1,b2....b(k / 2)...bm
若a(k / 2) 不难得出第k大的数必然不会出现在nums1的[1, k / 2]这个闭区间,反之亦然。
这里要注意一个边界条件:如果数组的长度取不到k/2,便要将其置为数组的最后一个数。

class Solution {
 public int help(int[] nums1, int start1, int end1, int[] nums2, int start2, int end2, int k){
    int len1 = end1 - start1 + 1;
    int len2 = end2 - start2 + 1;
    //当数组一为空时,返回数组2第k小元素即可
    if(len1 == 0)
        return nums2[start2+ k - 1]; //k = 1, return nums2[start2] ... k = 2, return nums2[start2 + 1]
    //当数组二为空时,返回数组1第k小元素即可
    if(len2 == 0)
        return nums1[start1 + k - 1]; //k = 1, return nums1[start1] ... k = 2, return nums1[start1 + 1]
    if(k == 1)
        return Math.min(nums1[start1], nums2[start2]);
    int mid1 = start1 + Math.min(k / 2, len1) - 1;//避免数组越界
    int mid2 = start2 + Math.min(k / 2, len2) - 1;
    if(nums1[mid1] > nums2[mid2])//肯定不在nums2的[start2, mid2]
        return help(nums1, start1, end1, nums2, mid2 + 1, end2, k - (mid2 - start2 + 1));//排除了nums2[start2, mid2]中的(mid2 - start2 + 1)个数
    else
       return help(nums1, mid1 + 1, end1, nums2, start2, end2, k - (mid1 - start1 + 1));//..
}
public double findMedianSortedArrays(int[] nums1, int[] nums2){
    int left = (nums1.length + nums2.length + 1) / 2; //两个数组之和为奇数的时候,k的取值
    int right = (nums1.length + nums2.length + 2) / 2; //两个数组之和为偶数,k的取值
    return (help(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, left) + help(nums1, 0, nums1.length - 1, nums2, 0, nums2.length - 1, right)) * 0.5;
}
}

本文使用 mdnice 排版


评论


亲,登录后才可以留言!