4.寻找两个有序数组的中位数:帮你避开Top题解中递归法的边界讨论

排名第一的递归法中的基本思路相信大家话费一些时间就能看懂。但是对于边界讨论情况可能会耗费更多的时间。

在TOP题解中提到需要对两个条件进行判断,但是在在i,j触发到边界时,

如果A[i−1],B[j−1],A[i],B[j] 中部分不存在,那么我们只需要检查这两个条件中的一个(或不需要检查)。

在这里做个总结:

  • 在检查上面两个条件时,只有返回值是true的时候,才需要对imin,imax进行数值改变。
  • 如果判断的返回值是false,则不对imin,imax进行操作。
  • 如果不检查上面两个条件,也不需要对imin,imax进行操作。

我发现,在判断为false和不进行检查时,我们进行的操作是相同的。

我的思路是,在i,j触发到边界时,仍然进行判断,但是判断返回值设定为false。
我是通过写一个方法getEle来做到的。同时我重写了Math.max和Math.min方法来消除getEle带来的影响。

这样大家就不用劳心劳力的判断是否触发边界情况了。

var findMedianSortedArrays = function (nums1, nums2) {
    if (nums1.length > nums2.length) {
        [nums1, nums2] = [nums2, nums1];
    }
    let m = nums1.length,
        n = nums2.length;
    let i, j; //分割数组时,上面有个i个元素,下面有j个元素
    let _imin = 0,
        _imax = nums1.length;
    while (true) {
        i = parseInt((_imin + _imax) / 2);
        j = parseInt((m + n + 1) / 2) - i;
        if (getEle(nums1, i - 1) > getEle(nums2, j)) {//这里进行判断时,如果任意一个值是undefined会返回false
            _imax = i - 1;
        } else if (getEle(nums2, j - 1) > nums1[i]) {
            _imin = i + 1;
        } else {
            return ((m + n) % 2 === 0) ? (getMax(getEle(nums1, i - 1), getEle(nums2, j - 1)) + getMin(getEle(nums1, i), getEle(nums2, j))) / 2 : getMax(
                getEle(nums1, i - 1), getEle(nums2, j - 1));
        }
    }
    //对于超出边界的index,直接返回undefined
    function getEle(num, index) {
        if (num.length === 0) {
            return undefined;
        } else if (index < 0 || index >= num.length) {
            return undefined;
        }
        return num[index];
    }
    //因为在调用getEle方法时,有时会返回undefined,这会影响Math.max Math.min方法的运用,所以这里重写了一个最大最小是判断的方法
    function getMax(a, b) {
        return a === undefined ? (b === undefined ? 0 : b) : (b === undefined ? a : Math.max(a, b));
    }
    function getMin(a, b) {
        return a === undefined ? (b === undefined ? 0 : b) : (b === undefined ? a : Math.min(a, b));
    }
};

我在了leetcode上写的题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值