直接上例子
这是一个非常简单的数组,那么我们应该如何找到子数组的最大元素之和?
首先需要理解,得到这个最大的数,必定是多个正整数相加
比如4和5相加一定会大于4、5、(2+(-3)),显然在这里-3和2可以合并看为一个元素
因此可以得到一个结论
如果某几个元素相加(sum)之和小于等于0,那么这个子数组一定不包含它们
下面用画图的方式来演示
显然这个时候sum是正整数,可以不用被抛弃
于是用ans来记录目前sum的值(假设目前这个sum就是最大的)
逻辑继续向下运行
此时发现,sum不符合我们存进ans的条件了
故这次ans不发生更新,而是保留原来的值
这个时候下标i来到第四个元素,奇妙的事情发生了
sum这个时候为负数,显然我们不能再拿他与a[i]进行相加了
而是直接把原来的sum舍弃掉,并把a[i]的值赋给sum
*注:这里并不用担心之前的数据丢失了,因为之前的最大值已经存在了ans中
操作完以后又发现sum大于ans了!于是再次更新ans
如此循环,只需要循环n-1次,一定能找到最大的子数组
请看具体的实现代码
int search(int* a,int n)
{
int sum;
int ans = -10000000;
sum = a[0];
for (int i = 1; i < n; i++)
{
if (sum < 0)
sum = p[i];
else
sum += a[i];
ans = max(ans, sum);
}
return ans;
}