用sum表示当前子数组的和,用Max表示子数组之和的最大值。
初始化:将sum和Max初始化为数组中的第一个元素的值。
思路:
遍历数组,依次判断数组中的每一个元素的值 将其与0作比较,
如果其大于等于0,
再判断之前子数组的和是否大于0,
如果之前子数组的和小于0,
则当前元素即为当前子数组之和。
如果之前子数组之和大于0,
则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和。
如果其小于0
判断Max是否大于等于0
如果Max大于等于0
则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和,跳过循环
如果Max小于0
当前子数组之和即为当前元素
将当前子数组之和与最大值Max作比较
如果其大于最大值,则更新
------------------------------------------------------------------------------------------
因为只遍历了一次数组,所以时间复杂度为O(n)
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n, s[10], sum, Max;
cin >> n;
for(int i = 0; i < n; ++i)
cin >> s[i];
for(int i = 0; i < n; ++i)
{
if(i == 0)
Max = sum = s[i]; //将sum和Max初始化为数组中的第一个元素的值。
else
{
if(s[i] >= 0)
{
if(sum <= 0)
sum = s[i];
else
sum = sum + s[i];
}
else
{
if(Max >= 0)
{
sum = 0;
continue;
}
else
sum = s[i];
}
if(sum > Max)
Max = sum;
}
}
cout << "max = " << Max << endl;
return 0;
}