LeedCode第四题:寻找两个有序数组的中位数

Posted 杯莫停、

tags:

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

这里我有两种解法,第一种执行时间是157ms,通过两个for循环排序(有点多余)效率比较慢:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int i = 0;
        int j = 0;
        double res = 0;

        int[] nums3 = new int[len1 + len2];
        while (i < len1) {
            nums3[i] = nums1[i];
            i++;
        }

        while (j < len2) {
            nums3[len1] = nums2[j];
            len1++;
            j++;
        }

        int len3 = nums3.length;
        int temp = 0;
        for (int h = 0; h < len3; h++) {
            for (int k = 1; k < len3; k++) {
                if (nums3[k - 1] > nums3[k]) {
                    temp = nums3[k - 1];
                    nums3[k - 1] = nums3[k];
                    nums3[k] = temp;
                }
            }
        }
        if (len3 % 2 == 0) {
            int m = len3 / 2;
            res = (float)(nums3[m] + nums3[m - 1]) / 2;
        }
        if (len3 % 2 == 1) {
            int n = (len3 - 1) / 2;
            res = nums3[n];
        }
        return res;
    }
}

通过优化后的代码,执行时间是3ms,明显效率快很多:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int i = 0;
        int j = 0;
        double res = 0;

        int[] nums3 = new int[len1 + len2];

        int len3 = nums3.length;
        int temp = 0;
        while(i < len1 && j < len2) {
            if (nums1[i] < nums2[j]) {
                nums3[temp] = nums1[i];
                temp++;
                i++;
            }
            else {
                nums3[temp] = nums2[j];
                temp++;
                j++;
            }
        }
        while (i < len1) {
            nums3[temp] = nums1[i];
            temp++;
            i++;
        }
        while (j < len2) {
            nums3[temp] = nums2[j];
            temp++;
            j++;
        }

        if (len3 % 2 == 0) {
            int m = len3 / 2;
            res = (float)(nums3[m] + nums3[m - 1]) / 2;
        }
        if (len3 % 2 == 1) {
            int n = (len3 - 1) / 2;
            res = nums3[n];
        }
        return res;
    }
}

以上是关于LeedCode第四题:寻找两个有序数组的中位数的主要内容,如果未能解决你的问题,请参考以下文章

leetcode第四题:两个有序数组的中位数

算法实战寻找两个有序数组的中位数

刷题之路第四题--取两个顺序数组的数值的中位数

Leetcode寻找两个有序数组的中位数

[LeetCode] 寻找两个有序数组的中位数

[LeetCode] 4. 寻找两个有序数组的中位数