//////////////// O(n^3)
#include<stdio.h>
int MaxSum(int* A, int n){
int maximum = -(1<<31);
int sum=0,i,j,k;
for(i = 0; i < n; i++)
{
for(j = i; j < n; j++)
{
for( k = i; k <= j; k++)
{
sum += A[k];
}
if(sum > maximum)
maximum = sum;
sum=0; //这里要记得清零,否则的话sum最终存放的是所有子数组的和。
//也就是编程之美上所说的bug。多谢苍狼。
}
}
return maximum;
}
int main()
{
int data[]={-10, -3,-4, -3, -4, -1, -5};
int max;
printf("%d\n",MaxSum(data,7));
return 0;
}
//////o(N)
#include <iostream>
using namespace std;
int maxSum(int a[],int n)
{
int max=a[0]; //全负情况,返回最大数
int sum=0;
for(int j=0;j<n;j++)
{
if(sum>=0) //如果sum>=0的话,就加
sum+=a[j];
else
sum=a[j]; //如果加上某个元素,sum<0了,就不加
if(sum>max)
max=sum;
}
return max;
}
int main()
{
int a[]={1, -2, 3, 100, -4, -7, 2, -5,0,2,20};
//int a[]={-1,-2,-3,-4}; //测试全是负数的用例
cout<<maxSum(a,11)<<endl;
return 0;
}
本文提供了两种求解子数组最大和的算法实现:一种时间复杂度为O(n³)的朴素解法,通过三层循环遍历所有可能的子数组;另一种时间复杂度优化到O(n)的高效解法,采用动态规划思想,仅需一次遍历即可得出结果。

被折叠的 条评论
为什么被折叠?



