关于Kadane算法,可以参考wiki
大致的思想是: 第i个元素之前(包括i)的最大子数组之和为B(i)
,那么B(i+1)=max(A(i+1), A(i+1)+B(i))
。因为如果A(i+1)+B(i)
比A(i+1)
小的话,那说明B(i)
是负的,所以可以抛弃掉,从A(i+1)
开始计算即可。
使用go语言表示上面的思想:
func maxSubArray(nums []int) int {
ret := nums[0]
sum := nums[0]
for i := 1; i < len(nums); i++ {
sum = max(nums[i], nums[i] + sum)
ret = max(ret, sum)
}
return ret
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
复制代码
相关题目
1. Maximum Subarray
上面的代码就是这道题的答案
2. Best Time to Buy and Sell Stock
func maxProfit(prices []int) int {
maxCur := 0
maxSoFar := 0
for i := 1; i < len(prices); i++ {
maxCur += prices[i] - prices[i-1]
maxCur = max(0, maxCur)
maxSoFar = max(maxCur, maxSoFar)
}
return maxSoFar
}
复制代码