LeetCode刷题记录(十二):寻找两个正序数组的中位数

145 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

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

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

根据题目描述,寻找两个正序数组的中位数,注意,是两个正序数组。

也就是说是两个正序数组组合后的中位数。

题目提供素材

题目提供了以下素材:

  1. 两个正序数组,数组长度处于0到1000之间,可能为0。

我的解读

要想获得两个正序数组组合后的中位数,那必然要做两件事。

  1. 将两个正序数组组合成一个有序数组。

  2. 将组合后的有序数组取出对应的中位数。

解题思路

解题思路其实有很多种,有朋友也做了这道题,我发现他是用Java中的集合做的,将两个数组所有的元素放到一个集合里面。

通过Collection.sort方法来进行排序,或者使用Arrays中的排序方法。

执行结果比较糟糕,虽然执行通过了,但是执行速度和内存都没有什么节约。

显然这个方法不太可行,如果是高强度的调用,那将对服务器会是一个很大的压力。

所以我的思路是不同的,一开始的想法是将一个数组塞进到另外一个数组中,转念一想不对,数组的长度有所限制。

只能弄一个新数组了,下面分步骤来说一下我的思路:

  1. 因为两个数组都是正序,先要判断第一个值先选择哪个数组中的。

  2. 然后声明三个变量,分别代表着数组1的下标索引,数组2的下标索引,结果数组的下标索引。

  3. 通过循环的方式,对两个数组不断取值,再通过判断两个数组的值进行赋值。

代码

看一下具体代码吧。

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int[] result = new int[nums1.length + nums2.length];
        if(result.length == 0){
            return 0.0;
        }else if(nums1.length == 0){
            result = nums2;
        }else if(nums2.length == 0){
            result = nums1;
        }else{
            boolean is1 = nums1[0] < nums2[0];
            int num1 = 0;
            int num2 = 0;
            int resultIndex = 0;
            while(true){
                if(resultIndex == result.length){
                    break;
                }
                if(is1){
                    result[resultIndex] = nums1[num1];
                    resultIndex++;
                    num1++;
                    if(num2 > nums2.length - 1){
                        continue;
                    }else if(num1 > nums1.length - 1 || nums1[num1] > nums2[num2]){
                        is1 = false;
                    }
                }else{
                    result[resultIndex] = nums2[num2];
                    resultIndex++;
                    num2++;
                    if(num1 > nums1.length - 1){
                        continue;
                    }else if(num2 > nums2.length - 1 || nums2[num2] > nums1[num1]){
                        is1 = true;
                    }
                }
            }
        }
        if(result.length % 2 != 0){
            return (result[result.length / 2]);
        }else{
            int s1 = result.length / 2;
            int s2 = result.length / 2 -1;
            return (result[s1] + result[s2]) / 2.0;
        }
    }
}

执行结果

临近下班,刷了一道题。

image.png