Kadane算法

3,106 阅读1分钟

关于Kadane算法,可以参考wiki

-w882

大致的思想是: 第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

-w858

上面的代码就是这道题的答案

2. Best Time to Buy and Sell Stock

-w1153

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
}