Leetcode4. 寻找两个正序数组的中位数(二分)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode4. 寻找两个正序数组的中位数(二分)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

解题思路

我们如果暴力的话直接可以合并两个数组再找出中位数,但是我们其实可以不用合并两个数组,而是转化为寻找两个数组中的第k数,寻找有序数组的第k个数就可以用到二分。

代码

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int t = nums1.length + nums2.length;    //总长度
        if(t % 2 == 0)  //总长度为偶数
            return (f(nums1, 0, nums2, 0, t / 2) + f(nums1, 0, nums2, 0, t / 2 + 1)) / 2.0; //中位数为两个数的平均数
        else
            return f(nums1, 0, nums2, 0, t / 2 + 1);//中位数为中间那个数
    }
    int f(int[] nums1, int i, int[] nums2, int j, int k) {
        if(nums1.length - i > nums2.length - j) //我们使得剩余长度小的放在nums1;如果nums1的剩余长度大于nums2,则交换位置
            return f(nums2, j, nums1, i, k);
        if(nums1.length == i) //nums1已经全部遍历完,那么中位数肯定再nums2的第j+k-1个
            return nums2[j + k - 1];
        if(k == 1)  //如果k等于1,就代表是第一个数,那么我们就直接返回两个数组中较小的那个数
            return Math.min(nums1[i], nums2[j]);
        int si = Math.min(i + k / 2, nums1.length);//取nums1第剩余区间的中间那个数
        int sj = j + k / 2; //取nums2剩余区间中间那个数
        if(nums1[si - 1] > nums2[sj - 1])   //代表可以排除nums2中sj左半边的数
            return f(nums1, i, nums2, sj, k - k / 2);
        else 
            return f(nums1, si, nums2, j, k - (si - i));//排除nums1左半边的数
    }
}

复杂度分析

  • 时间复杂度:O(log(m + n))
  • 空间复杂度:O(1)

以上是关于Leetcode4. 寻找两个正序数组的中位数(二分)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode4. 寻找两个正序数组的中位数

Leetcode4. 寻找两个正序数组的中位数(二分)

每日算法/刷穿 LeetCode4. 寻找两个正序数组的中位数(困难)

C++&Python 描述 LeetCode 4. 寻找两个正序数组的中位数

二分 - 寻找两个有序数组的中位数 - Leetcode 4

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