首页 > 算法(附思维导图+全部解法)300题之(4)2正序数组中位数
头像
码农三少
发布于 2021-07-31 18:26
+ 关注

算法(附思维导图+全部解法)300题之(4)2正序数组中位数

标题:算法(leetode,附思维导图 + 全部解法)300题之(4)寻找两个正序数组的中位数

一 题目描述

题目描述
题目描述

二 解法总览(思维导图)

思维导图

三 全部解法

1 方案1

1)代码:

var findMedianSortedArrays = function(nums1, nums2) {
    // 注意: push() 返回的是该数组的最新长度,
    // 所以不可以 nums1.push(...nums2).sort((a, b) => a - b);
    nums1.push(...nums2);
    nums1.sort((a, b) => a - b);
    let l = nums1.length;
    // 判断奇偶性,返回对应的中位数
    return l % 2 ? nums1[parseInt(l / 2)] : (nums1[l / 2 - 1] + nums1[l / 2]) / 2;
};

2 方案2

1)代码:

var findMedianSortedArrays = function(nums1, nums2) {
    let n1 = nums1.length;
    let n2 = nums2.length;

    // 两个数组总长度
    let len = n1 + n2;

    // 保存当前移动的指针的值(在nums1或nums2移动),和上一个值
    let preValue = -1;
    let curValue = -1;

    //  两个指针分别在nums1和nums2上移动
    let point1 = 0;
    let point2 = 0;

    // 需要遍历len/2次,当len是奇数时,最后取curValue的值,是偶数时,最后取(preValue + curValue)/2的值
    for (let i = 0; i <= Math.floor(len/2); i++) {
        preValue = curValue;
        // 需要在nums1上移动point1指针
        if (point1 < n1 && (point2 >= n2 || nums1[point1] < nums2[point2])) {
            curValue = nums1[point1];
            point1++;
        } else {
            curValue = nums2[point2];
            point2++;
        }
    }

    return len % 2 === 0 
        ? (preValue + curValue) / 2
        : curValue
};

3 方案3

1)代码:

var findMedianSortedArrays = function(nums1, nums2) {
    // nums1长度比nums2小
    if (nums1.length > nums2.length) {
        [nums1, nums2] = [nums2, nums1];
    }

    let m = nums1.length;
    let n = nums2.length;
    // 在0~m中查找
    let left = 0;
    let right = m;

    // median1:前一部分的最大值
    // median2:后一部分的最小值
    let median1 = 0;
    let median2 = 0;

    while(left <= right) {
        // 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
        // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
        const i = left + Math.floor((right - left) / 2);
        const j = Math.floor((m + n + 1) / 2) - i;

        const maxLeft1 = i === 0 ? -Infinity : nums1[i - 1];
        const minRight1 = i === m ? Infinity : nums1[i];

        const maxLeft2 = j === 0 ? -Infinity : nums2[j - 1];
        const minRight2 = j === n ? Infinity : nums2[j];

        if (maxLeft1 <= minRight2) {
            median1 = Math.max(maxLeft1, maxLeft2);
            median2 = Math.min(minRight1, minRight2);
            left = i + 1;
        } else{
            right = i - 1;
        }
    }
    return (m + n) % 2 == 0 ? (median1 + median2) / 2 : median1;
};

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

热门推荐