力扣4 寻找两个有序数组的中位数

4 阅读1分钟

思路:
如果不考虑时间复杂度,最简单的方法就是合并,排序,取值
但是排序函数时间复杂度过高,而给的又是两个有序数组
所以直接两个指针,从两个数组中从小到大拿值

代码:
数组个数为奇数和偶数时中位数计算方式不同
奇数只需要一个中间元素,偶数需要两个
遍历次数是数组一半的长度
每次遍历要找到两个数组中较小的数值并移动指针
奇数直接返回中间的值,偶数返回中间两个值的平均值

var findMedianSortedArrays = function (nums1, nums2) {
    let len1 = nums1.length
    let len2 = nums2.length
    let len = len1 + len2
    let p1 = 0
    let p2 = 0

    function getMin() {
        if (p1 < len1 && p2 < len2) {
            if (nums1[p1] <= nums2[p2]) {
                return nums1[p1++]
            } else {
                return nums2[p2++]
            }
        } else if (p1 < len1) {
            return nums1[p1++]
        } else if (p2 < len2) {
            return nums2[p2++]
        }
        return -1
    }

    if (len % 2 === 1) {
        let midIdx = Math.floor(len / 2)
        for (let i = 0; i < midIdx; i++) {
            getMin()
        }
        return getMin()
    } else {
        let midIdx2 = len / 2
        let midIdx1 = midIdx2 - 1
        for (let i = 0; i < midIdx1; i++) {
            getMin()
        }
        return (getMin() + getMin()) / 2
    }
};