NC19 连续子数组的最大和

88 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

题解

题目

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。

数据范围: 1 <= n <= 2*10^5 −100<=a[i]<=100

要求:时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n) 进阶:时间复杂度为 O(n)O(n),空间复杂度为 O(1)O(1)

示例

输入: [1,-2,3,10,-4,7,2,-5]
返回值:18   

解题

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param array int整型一维数组 
 * @return int整型
 */
export function FindGreatestSumOfSubArray(array: number[]): number {
    let temp = 0
    let res = array[0]
    for(let i = 0; i < array.length; i++){
        temp = Math.max(array[i], array[i] + temp)
        res = Math.max(temp, res)
    }
    return res
}

思路

按照动态规划的思想采用带备忘的自顶向下法, 循环累加并依赖前面计算的结果, 从下标为 0 开始,一直累加, 直到当前的值已经大于累加的值, 替换累加值,每次累计都要记录当前累加值并且进行比较(已经有记录的和记录做对比, 只记录最大的值)。

过程

示例: [1, -2, 3, 10, -4, 7, 2, -5],

初始: let temp = 0, res = 1

  • 第一次循环: temp = 1, res = 1;
  • 第二次循环 : temp = -1, res = 1;
  • 第三次循环 : temp = 3, res = 3;
  • 第四次循环: temp = 13, res = 13;
  • 第五次循环: temp = 9, res = 13;
  • 第六次循环: temp = 16, res = 16;
  • 第七次循环: temp = 18, res = 18;
  • 第八次循环: temp = 13, res = 18;

输出: 18.

每次计算时都需要判断一下是否可以累加之前的,或者重新开始。