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

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

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

相关推荐

头像
05-16 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务