题目描述:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
思路1:贪心
用sum记录子数组的和,max记录最大值。每次移动 sum + nums[i],如果有sum > max,更新max的值,如果sum < 0,这个值会使的 sum + nums[i+1] < sum,所以可以直接把sum充值成0,下一次遍历直接使得区间从 i+1 开始
代码:
func maxSubArray(nums []int) int {
max := nums[0]
sum := 0
for r := 0; r < len(nums); r++ {
sum += nums[r]
fmt.Println(r, nums[r], sum, sum > max)
if sum > max {
max = sum
}
if sum < 0 {
sum = 0
}
}
return max
}
思路2:动态规划
动态规划模式化解题思路可以看代码随想录
dp五部曲: 确定dp含义和下标含义: dp[i], 以i结尾 的字串最大值
确定递推公式:dp[i+1] = dp[i] + nums[i+1] ,如果dp[i+1] < 0 , dp[i+1] = 0
初始化:dp[0] = nums[0]
遍历 顺序:从前到后
举例: -1,2,-3,1,5
func maxSubArray(nums []int) int {
dp := make([]int, len(nums)+1)
max := nums[0]
for i := 1; i < len(dp); i++ {
dp[i] = dp[i-1] + nums[i-1]
if max < dp[i] {
max = dp[i]
}
if dp[i] < 0 {
dp[i] = 0
}
}
return max
}