53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)
思路1 贪心:
1. 创建两个变量,一个存储遍历过程中最大子数组和historyMax,一个存储前面元素的子数组和preMax 。
2. 为这两个值historyMax和preMax赋予int的最小值。
3.对nums进行遍历,如果preMax < 0,则抛弃这个preMax 值,用当前元素的值作为preMax 新的值。 如果preMax > 0, 则把当前元素加到preMax 上,在和historyMax进行比较,historyMax等于两者中大的值。
4.返回historyMax的值。
import "math" func maxSubArray(nums []int) int { preMax := math.MinInt historyMax := math.MinInt for _, item := range nums { if preMax < 0 { preMax = item } else { preMax += item } historyMax = Max(preMax, historyMax) } return historyMax } func Max(x, y int) int { if x > y { return x } return y }
思路2 动态规划:
1.对需求进行拆分,分别计算每一个位置的子数组和
2.返回最大的子数组和
import "math" func maxSubArray(nums []int) int { preNum := 0 for i, _ := range nums { if preNum > 0 { nums[i] += preNum } preNum = nums[i] } maxNum := math.MinInt for _, item := range nums { if item > maxNum { maxNum = item } } return maxNum }