题解 | #连续子数组的最大和(二)#

连续子数组的最大和(二)

http://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

没看到typescript题解,我来补充一个,包含空间复杂度O(n),O(1)两种方法;

题解:直接在 连续数组最大和 题解结果中改造,增加left,right变量记录子数组左右序号即可,那么问题就转化成了,如何更新left,right变量。

export function FindGreatestSumOfSubArray(array: number[]): number {
    // write code here
    let maxVal = array[0];
    for(let i=1;i<array.length;i++) {
        if(array[i-1] > 0) {
            array[i] += array[i-1];
        }
        maxVal = maxVal < array[i] ? array[i] : maxVal;
    }
    return maxVal;
}
  • 对于right,很明显当需要更新maxSumVal时就需要更新最大子数组的右边界,同时新增lastLeft记录当前left位置;
  • 对于left,当resList[i-1] < 0 时,我们会重新计算子数组的连续和,因此这里也是更新left变量时机;
  • 最后,根据left,right截取子数组空间时,要注意,按照我们的left,right更新方法,left可能会大于right,此时令left=lastLeft即可;
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型一维数组
 */
export function FindGreatestSumOfSubArray(array: number[]): number[] {
    // write code here
    let lastLeft = 0;
    let left = 0, right = 0;
    let maxVal = array[0];
    // ======================================================
    // 1.开辟新数组存储,空间复杂度O(n)
    // ======================================================
//     const resList = [array[0]];
//     for(let i=1;i<array.length;i++) {
//         if(resList[i-1] >= 0) {
//             resList[i] = resList[i-1] + array[i];
//         } else {
//             resList[i] = array[i];
//             left = i;
//         }
//         if(resList[i] >= maxVal) {
//             maxVal = resList[i];
//             right = i;
//         }
//     }
    // ======================================================
    // 2.无需开辟新数组,增加中间变量记录resList[i-1]即可
    // ======================================================
    let lastSumVal = array[0]
    for (let i=1;i<array.length;i++) {
        if(lastSumVal >= 0) {
            lastSumVal += array[i];
        } else {
            lastSumVal = array[i];
            left = i;
        }
        if(lastSumVal >= maxVal) {
            maxVal = lastSumVal;
            lastLeft = left;
            right = i;
        }
    }
    // ======================================================
    if(right < left) {
        left = lastLeft;
    }
    return array.splice(left, right-left+1)
}
全部评论
你好,像这样的测试用例[1,2,3,4,-11,1,2],最大和的连续子数组应该是[1,2,3,4]吧,但是使用你的算法,结果是[4],我感觉left和right的更新还是有问题的
1 回复 分享
发布于 2022-02-07 23:17

相关推荐

真烦好烦真烦:牛友太有实力了
点赞 评论 收藏
分享
04-03 12:09
東京大学 C++
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务