求子数组的最大和
#include <iostream>
using namespace std;
int maxSum(int* a, int n)
{
int sum=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 maxSum1(int* a, int n)
{
int sum=0;
int b=0;
int i=0;
while(i<n)
{
sum+=a[i++];
if (b<sum)
{
b=sum;
}
else if (sum<0)
{
sum=0;
}
}
return b;
}
int maxSum2(int* a, int n)
{
int sum;
int b=0;
int i=0, j;
for (i=0; i<n; i++)
{
sum=0;
for(j=i; j<n; j++)
{
sum+=a[j];
if (b<sum)
{
b=sum;
}
}
}
return b;
}
int main()
{
int a[10]={1, -2, 3, 10, -4, 7, 2, -5};
cout<<maxSum2(a,8)<<endl;
return 0;
}
maxSum和maxSum1的时间复杂度都是O(n), maxSum2的时间复杂度是O(n^2).
maxSum算法设计
1、遍历数组中的每个元素进行累加,如果累加值小于0,则进行重新累加。
2、用变量sum保存每次累加值比sum的值。
maxSum2算法设计
1、依次从第一个节点遍历最后一个节点。
2、累加每次遍历的结果,用sum保存最大的值。

浙公网安备 33010602011771号