穷举法:
int MaxSubArraySum(int a[], int n)
{
int i, j, MaxSum = 0, tmpSum, cnt;
for (i=1; i<=n; i++)
{
for (j=0; j+i<=n; j++)
{
cnt = 0;
tmpSum = 0;
while (cnt < i)
{
tmpSum += a[j+cnt];
cnt++;
}
if (MaxSum < tmpSum)
{
MaxSum = tmpSum;
}
}
}
return MaxSum;
}
通过循环嵌套,控制步长,求出所有的子数组的值
找出规律法:
int MaxSub(int a[], int n)
{
int sum = 0, tmpSum = 0;
int i;
for (i=0; i<n; i++)
{
if (tmpSum <= 0)
{
tmpSum = a[i];
}
else
{
tmpSum += a[i];
}
if (sum < tmpSum)
{
sum = tmpSum;
}
}
return sum;
}
这个代码就简洁了很多,时间复杂度也达到了题目要求的O(n)
写出这种算法的关键在于,弄清楚当子数组的和小于0时就可以舍弃掉,从下一个元素开始计算子数组和了。