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

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

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

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

解题思路:题目要求找出两个有序数组合并之后的中位数,中位数和数组的长度有关,一般情况下,通过对有序数组的长度除以2后所对应位置的元素就是中位数。根据数的奇偶性可分为两种情况,当数组长度为奇数时,中位数只有一个,当数组的长度为偶数时,中位数有两个,这时就需要将两个数进行相加后除以二得到中位数,根据示例2发现,返回的是一个浮点数。算法的时间复杂度和空间复杂度取决于如何将两个数组合并并且排序。

    public double finmediansortedarrat(int[] nums1, int[] nums2) {
        int[] nums;
        int n1 = nums1.length;//数组一的长度
        int n2 = nums2.length;//数组二的长度
        nums = new int[n1 + n2];//实例化新数组,长度为两数组相加
        /**
         * 当数组1以为空时,数组2直接根据数组长度返回中位数
         */
        if (n1 == 0) {
            if (n2 % 2 == 0) {
                return (nums2[n2 / 2 - 1] + nums2[n2 / 2]) / 2;
            } else {
                return nums2[n2 / 2];
            }
        }
        /**
         * 当数组2以为空时,数组1直接根据数组长度返回中位数
         */
        if (n2 == 0) {
            if (n1 % 2 == 0) {
                return (nums1[n1 / 2 - 1] + nums1[n1 / 2]) / 2;
            } else {
                return nums1[n1 / 2];
            }
        }
        int count = 0;
        int i = 0, j = 0;
        /**
         * 遍历合并后数组内的全部元素,
         * 如果数组一为零,数组二不为零,新数组就是数组二
         */
        while (count != (n1 + n2)) {
            if (i == n1) {
                while (j != n2) {
                    nums[count++] = nums2[j++];
                }
                break;
            }
            //如果数组二为零,数组一不为零,那么新数组就是数组一
            if (j == n2) {
                while (i != n1) {
                    nums[count++] = nums2[j++];
                }
                break;
            }
            //对数组中的元素进行排序
            if (nums1[i] < nums2[j]) {
                nums[count++] = nums1[i++];
            } else {
                nums[count++] = nums2[j++];
            }
        }
        //判断数组长度的奇偶
        if (count % 2 == 0) {
            return (nums[count / 2 - 1] + nums[count]) / 2.0;
        } else {
            return nums[count / 2];
        }
    }

时间复杂度O(m+n)
空间复杂度O(m+n)

你可能感兴趣的:(leetcode,leetcode)