题目:输入一个整型数组,数组中有正数也有负数,数组中一个或者连续的多个整数构成一个子数组。求所有子数组和的最大值
要求时间复杂度为O(n)
分析:如果用函数f(i)表示以第i个数字结尾的数组的最大和,那么我们需要求出max(f[i]),其中0<=i<n,那么我们可以用以下递归公式求出f(i)
1,i=0 || f(i-1)<=0 f(i) = data(i)
2,i!=0 || f(i-1)>0 f(i) = f(i-1) + data[i]
即当第i-1个数字结尾的子数组所有数字的和小于0的时候,如果把这个负数和第I个数相加,得到的结果比第i个数字本身小,所以这种情况下以第i个数字作为以第i个数字结尾的子数组的和,如果以第i-1个数字结尾的子数组的和大于0的话,让其与第i个数字相加作为以第i个数字结尾的子数组的和
参考代码如下:
#include <iostream>
using namespace std;
bool g_validInput = false;//输入格式是否正确
int findMaxOfSubArray(int *data,int length)
{
if(data == NULL || length <= 0)//如果data为NULL或者数组没有数字,输入非法
{
g_validInput = true;
return 0;
}
g_validInput = false;
int sum = 0;//子数组的和
int sumOfMax = 0x800000000;
for(int i=0;i<length;i++)
{
if(sum <= 0)
{
sum = data[i];
}
else
{
sum = sum + data[i];
}
if(sum > sumOfMax)
{
sumOfMax = sum;
}
}
return sum;
}
int main()
{
int data[10];
for(int i=0;i<10;i++)
{
cin>>data[i];
}
int result = findMaxOfSubArray(data,10);
cout<<result<<endl;
return 0;
}