JZ30 连续子数组的最大和

连续子数组的最大和

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).

思路:

动态规划,设动态规划列表 dp,dp[i] 代表以元素 array[i] 为结尾的连续子数组最大和。
状态转移方程: dp[i] = Math.max(dp[i-1]+array[i], array[i]);
具体思路如下:
1.遍历数组,比较 dp[i-1] + array[i] 和 array[i]的大小;
2.为了保证子数组的和最大,每次比较 sum 都取两者的最大值;
3.用max变量记录计算过程中产生的最大的连续和dp[i];

func FindGreatestSumOfSubArray( array []int ) int {
    // write code here
    if len(array) == 0 {
        return 0
    }

    maxSum := array[0]
    curSum := array[0]

    for i := 1; i < len(array);i++ {
        if curSum < 0 {
            curSum = array[i]
        } else {
            curSum += array[i]
        }

        if curSum > maxSum {
            maxSum = curSum
        }
    }

    return maxSum
}

  

posted @ 2021-04-10 10:25  zqlucky  阅读(49)  评论(0编辑  收藏  举报