本题的要求显然是O(N)级的复杂度咯
结合书上的分析,可以发现如下条件:
从数组右边像左遍历,当前下标为i,那么最大值有3中情形:
1. 最大值为array[i];
2. 最大值为array[i] + maxSumInclude;
3. 最大值为不包括array[i]的maxSumExclude;
最后返回最大值: max(maxSumInclude, maxSumExclude);
相应代码如下:
是不是还可以实现得更优雅一点呢,这也就是编程之美给出的算法了:
All[0] = max{A[0], A[0] + start[1], All[1]};
A[0]表示第1个元素
start[1]表示包含元素A[1]的连续最大子数组和
All[1]表示max(start[1], All[2]);
实际上start[1]对应maxSumInclude,All[2]对应的是maxSumExclude
所以相应代码如下: