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

题目链接

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

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

示例1:

  1. 输入:nums1 = [1,3], nums2 = [2]
  2. 输出:2.00000
  3. 解释:合并数组 = [1,2,3] ,中位数 2

示例2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

示例3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000

示例4:

输入:nums1 = [], nums2 = [1]
输出:1.00000

示例5:

输入:nums1 = [2], nums2 = []
输出:2.00000

自己写的,时间复杂度O(m+n)

  • 归并,合成一个数组
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int total = m + n;
        int z = (m + n) / 2;
        double[] arr = new double[m + n];
        int i = 0, j = 0, k = 0;
        double zhong;
        // 如果有一个数组长度为0,不进行数组拼接
        if (m == 0) {
            if (total % 2 == 0) {
                zhong = (nums2[z - 1] + nums2[z]) / 2.0;
            } else {
                zhong = nums2[z];
            }
            return zhong;
        } else if (n == 0) {
            if (total % 2 == 0) {
                zhong = (nums1[z - 1] + nums1[z]) / 2.0;
            } else {
                zhong = nums1[z];
            }
            return zhong;
        } else {
            while ((i < m) && (j < n)) {
                if (nums1[i] < nums2[j]) {
                    arr[k] = nums1[i];
                    k++;
                    i++;
                } else {
                    arr[k] = nums2[j];
                    k++;
                    j++;
                }
            }

            if (nums1[m - 1] < nums2[n - 1]) {
                for (; k < total; k++) {
                    arr[k] = nums2[j];
                    j++;
                }
            } else {
                for (; k < total; k++) {
                    arr[k] = nums1[i];
                    i++;
                }
            }
            if (total % 2 == 0) {
                zhong = (arr[z - 1] + arr[z]) / 2.0;
            } else {
                zhong = arr[z];
            }


            return zhong;
        }
    }
}
  • 不归并,两个指针,将较小指针后移一位,直到中位数位置

二分查找,时间复杂度:O(log(m+n))

转化成寻找两个有序数组中的第 k 小的数,其中 k为 (m+n)/2 或 (m+n)/2+1