出处:https://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html
问题:
数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值及该数组左右边界。
思路:
设sum[i]为以第i个元素结尾且和最大的连续子数组。假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组,实际上,要么是以第i-1个元素结尾且和最大的连续子数组加上这个元素,要么是只包含第i个元素,即sum[i] = max(sum[i-1] + a[i], a[i])。可以通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。
C++代码:
//定义结构体使函数返回多值
struct result
{
int sum;
int begin;
int end;
};
result findMax(int a[], int size)
{
struct result res = {a[0], 0, 0};
int sum = a[0], i;
for (i = 1; i < size; i++)
{
if (sum > 0)
{
sum += a[i];
}
else
{
sum = a[i];
res.begin = i;
}
if (sum > res.sum)
res.sum = sum;
res.end = i;
}
return res;
}
本博客文章仅供博主学习交流,博主才疏学浅,语言表达能力有限,对知识的理解、编写代码能力都有很多不足,希望各路大神多多包涵,多加指教。