func maxSubArray(nums []int) int { n := len(nums) if n == 0 { panic("input slice length is 0") } res := math.MinInt64 cur := 0 for _, v := range nums { cur += v res = max(res, cur) if cur < 0 { cur = 0 } } return res}
最大子数组和 - 动态规划
func maxSubArray(nums []int) int { n := len(nums) if n == 0 { panic("input slice length is 0") } dp := nums[0] res := dp for i := 1; i < n; i++ { dp = max(nums[i], dp + nums[i]) res = max(res, dp) } return res}
最大子数组和 - 分治
var ( theNums []int)type Status struct { lSum int // [l,r] 内以 l 为左端点的最大子段和 rSum int // [l,r] 内以 r 为左端点的最大子段和 mSum int // [l,r] 内的最大子段和 iSum int // [l,r] 的区间和}func maxSubArray(nums []int) int { n := len(nums) if n == 0 { panic("input slice length is 0") } theNums = nums return get(0, n - 1).mSum}func get(left, right int) Status { if left == right { return Status{ lSum: theNums[left], rSum: theNums[left], mSum: theNums[left], iSum: theNums[left], } } mid := left + ((right - left) >> 1) lSub := get(left, mid) rSub := get(mid + 1, right) return pushUp(lSub, rSub)}func pushUp(left, right Status) Status { return Status{ lSum: max(left.lSum, left.iSum + right.lSum), rSum: max(right.rSum, right.iSum + left.rSum), mSum: max(left.mSum, right.mSum, left.rSum + right.lSum), iSum: left.iSum + right.iSum, }}