一个一维int数组,这个数组有很多子数组,那么子数组之和的最大值是什么呢?
思考
1、题目说的子数组是连续的;
2、题目只需要求和,并不需要返回子数组的具体位置;
3、数组的元素是整数,所以数组可能包含有正整数、零、负整数;
举几个例子:
数组:[1, -2, 3, 5, -3, 2]应返回:8
数组:[0, -2, 3, 5, -1, 2]应返回:9
数组:[-9, -2, -3, -5, -3]应返回:-2,这也是最大子数组的和。
【解法一】:
直接的方法,记Sum[i,…,j]为数组A中第i个元素的第j个元素的和(其中0<=i<=j<n),遍历所有可能的Sum[i,…j],那么时间复杂度为O(NNN):
int MaxSum(int* A, int n)
{
int maxmum = -INF;
int sum;
for (int i = 0; i < n; i++)
{
for (int j = i; j < n; j++)
{
for (int k = i; k<=j; k++)
{
sum += A[k];
}
if (sum > maxmum)
maxmum = sum;
}
}
return maxmum;
}
如果注意到Sum[i,…j] = Sum[i,…j-1] + A[j],则可以将算法中的最后一个for循环省略,避免重复计算,从而使算法得以改进,改进后的算法如下,这时复杂度为O(N*N):
int MaxSum(int* A, <