算法—leetcode—53. 最大子序和,连续子数组的最大和

454 阅读1分钟

题目

  1. 最大子序和 连续子数组的最大和

题目描述

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

案例

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

思路

1,使用动态规划思想
2,寻找基本状态/状态转移/Db table
3,本题是连续的整数组成的子数组

优化

因为当前状态转移dp[i]至于dp[i-1]有关系,则我们可以通过状态压缩,同时求出最大值 maxNums := dp[0]
maxNums = max(maxNums, dp[i])

代码

package leetcode 

// maxSubArray
// 连续子数组的最大和
func maxSubArray(nums []int) int {
    if len(nums)==0 || nums == nil{
        return 0 
    }
    
    dp := make([]int, len(nums))
    // base case
    dp[0] = nums[0]
    
    maxNums := dp[0]
    // 通过DP table求每个位置连续子数组的和
    for i := 1; i< len(nums); i++{
        dp[i] = max(nums[i], dp[i-1]+nums[i])
        maxNums = max(maxNums, dp[i]) 
    }
    
    /*
    maxNums := -1 << 31
    for i:=0; i < len(dp);i++{
        maxNums = max(maxNums, dp[i]) 
    }
    */
    return maxNums
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}