53. 最大子数组和

58 阅读1分钟

53. 最大子数组和

题目描述:给你一个整数数组 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
}