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

last modify

问题简述

给定两个大小分别为 m 和 n 的正序(从小到大)数组 A 和 B。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

4. 寻找两个正序数组的中位数 - 力扣(LeetCode)

思路

  • 二分目标:找到最大的 i,使 A[i - 1] <= B[j],其中 j = (m + n + 1) / 2 - im, n 分别为 A, B 的长度;

  • 思路简述:将 A, B 分别分成如下两组,且保证 max(A_i-1, B_j-1) <= min(A_i, B_j),根据中位数的性质,目标值即 max(A_i-1, B_j-1)

    • 可证,该条件等价于找到最大的 i,使 A[i - 1] <= B[j](证明详见参考链接)

    寻找两个有序数组的中位数 - 力扣官方题解

        A_0, .., A_i-1 | A_i, .., A_m-1
        B_0, .., B_j-1 | B_j, .., B_n-1
    其中
        i + j == (m + n + 1) / 2
    这里使用 (m + n + 1) / 2 而不是 (m + n) / 2,
        是为了使当 m + n 为奇数时,前一半比后一半多一个,即 i + j == (m + n) - (i + j) + 1;
        偶数时不影响;
  • 关于 i == 0/m, j == 0/n 的处理细节见代码;

Python

Last updated