LeetCode寻找两个正序数组的中位数 | 算法练习系列

327 阅读2分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

前言

今天来一道数组相关的题目,寻找数组中的中位数,本题的思路不是很难,本文主要是给前端开发人员来个JavaScript版本的解题方法,本解题方法用到了es6中的新特性,具体思路及代码如下

题目描述

给定两个大小分别为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

示例 3:

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

输出:0.00000

示例 4:

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

输出:1.00000

示例 5:

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

输出:2.00000

解题思路

  • 本题输入的是两个数组,我们要求的是两个数组合并之后的数组的中位数,并且是要排序好的数组的中位数,因为输入的是正序数组,这里我们可以使用归并来获得合并之后的数组,归并的思路可以看这个题目,本文是直接用的sort进行排序。
  • 得到排序后的数组之后有两种情况,如果数组的项是单数的话,那么中位数的下标就是数组长度除以2取地板,如果数组的项是双数,那么中位数就是下标为数组长度除以2的项和前一项的和除以2
  • 根据不同的情况return 出结果即可,代码如下
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    var mergeArr = []
    var medianIndex = 0
    mergeArr = [...nums1,...nums2].sort((a,b) => a-b) //这里用es6中的展开运算符合并两个数组,并用sort进行排序得到合并后的有序数组
    if(mergeArr.length%2===1){ //合并数组长度为奇数的情况
        medianIndex = Math.floor(mergeArr.length/2)
        return mergeArr[medianIndex] 
    }else{ //合并数组为双数的情况
        var median1 = mergeArr.length/2
        var median2 = median1-1
        return (mergeArr[median1]+mergeArr[median2])/2
    }
};

LeetCode运行结果

耗时.PNG

总结

本题是一道简单是数组取中位数的题目,主要是分为两种情况,要考虑清楚,其次是合并数组的方法,可以用普通的数组方法concat,也可以用es6的展开运算法。大致就是这样,如有高见欢迎评论指出,gogogo