题目描述:
输入一个整型数组,数组理由整数也有负数。数组中有一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
输入:3 -1 1 2 (3为输入的个数,后面3个位数组中的元素{-1,1,2})
输出:3 (1+2=3)
输入:8 1 -2 3 10 -4 7 2 -5 (数组为{1,-2,3,10,-4,7,2,-5})
输出:18 (3,10,-4,7,2)
思路分析:
我们从头到尾逐个累加示例数组中的数字。初始化和为0。如果累加到当前的和小于0,那么再加上后面的元素的值,和不增反而小了。所以抛弃之前累加的和,重新开始累加,如果数字是一个负数,那么累加负数之后的和比原来的和还要小。因此我们要把之前得到的和保存下来,它有可能是最大的子数组的和。继续累加,如果当前的和比之前保存的和要大,那么就更新最大子数组的和。此过程循环。
参考代码:
#include <iostream>
#include <vector>
using namespace std;
bool InvalidValue = false;
int GreatestSumOfArray(vector<int> array,int length)
{
if(array.empty())
{
InvalidValue = true;
return 0;
}
InvalidValue = true;
int sum = 0;
int GreatestSum = 0x80000000; //0x表示16进制,该值表示带符号整型的最小值,-2^15-1
for(int i = 0; i < length; ++i)
{
if(sum <= 0)
sum = array[i];
else
sum += array[i];
if(sum > GreatestSum)
GreatestSum = sum;
}
return GreatestSum;
}
int main()
{
int n;
int num,sum;
vector<int> array;
cin >> n;
while((n--) > 0)
{
cin >> num;
array.push_back(num);
}
sum = GreatestSumOfArray(array,array.size());
cout << sum << endl;
return 0;
}
运行结果: