今天温故了一道小题目:求子数组的最大和,要求时间复杂度是O(N)
其实算法很简单,但是第一个想到的人不简单,证明过程也不容易.
思路就是如果加上一个正数,和会越加越大,但是一旦碰到负数,加上一个负数,整个和就会减少,所以遇到负数,要及时更新,确保不会加到下面的正数和中,不然总和会小!
附上代码:
#include <stdio.h>
int maxSum(int* a, int n)
{
int sum=a[0];
int b=0;
for(int i=0; i<n; i++)
{
if(b<0)
b=a[i];
else
b+=a[i];
if(sum<b)
sum=b;
}
return sum;
}
int main()
{
int a[10]={1, -2, 3, 10, -4, 7, 2, -5};
cout<<maxSum(a,8)<<endl;
return 0;
}
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,
那么最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
全部是负数的情况也可以由sum=a[0]解决!