题目
- 最大子序和 连续子数组的最大和
题目描述
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为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
}