JS算法之寻找两个正序数组的中位数

85 阅读1分钟

前言

因为5月太忙了,没啥时间整理所学的知识啦,就发一些之前做的LeetCode算法解题思路。

题目:寻找两个正序数组的中位数

题目来源:寻找两个正序数组的中位数 - 力扣(LeetCode)

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

算法的时间复杂度应该为 O(log (m+n)) 。 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

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

示例 1:

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

示例 2:

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

提示:

nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
\-106 <= nums1\[i], nums2\[i] <= 106

解题思路

  1. 先进行数组合并
  2. 判断数组长度是奇数还是偶数
  3. 如果是奇数就直接用排序好的数组进行-1除以2获取中位数
  4. 偶数的话比较麻烦一点,需要获取到中间两位数
  5. 排序的时候不能直接用sort,需要为sort加个函数确保数组中有负数时排序不会混乱

代码

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    //定义一个数组来接收合并后的数组
    let data = [];
    //我认为这是一个细节,用长的数组去合并短的数组可以提高一些性能
    //判断哪个数组比较长,然后map一遍用长的数组去合并端的数组
    if (nums1.length <= nums2.length) {
        nums1.map((item) => nums2.push(item));
        data = nums2;
    } else {
        nums2.map((item) => nums1.push(item));
        data = nums1;
    }
    //判断数组的长度是奇数还是偶数
    let j = data.length % 2 === 1 ? 1 : 0;
    //定义一个值来接收计算后取到的值
    let returnData = 0;
    if (j === 0) { //如果是偶数就取中间两位数取平均值
        returnData =
            (data.sort(prepare)[data.length / 2] + data.sort(prepare)[data.length / 2 - 1]) / 2;
    } else { //如果是奇数就取最中间的数
        returnData = data.sort(prepare)[(data.length - 1) / 2];
    }
    return returnData //返回中位数
    //定义一个函数来确保sort排序不被负数影响,避免造成混乱
    function prepare(a, b) {
        if (a > b) {
            return 1;
        } else if (a === b) {
            return 0;
        } else if (a < b) {
            return -1;
        }
    }
};