一.连续子数组的最大和
题目:输入一个整型数组,数组里有整数,也有负数。数组中一个或多个连续整数
组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)
解题思路:假设求数组1,-2,3,6,9,-4,5,2
的连续子数组的最大和。
- 1.从1开始,
1+(-2)=-1
,-1+3=2
小于3本身,说明前面的一个子数组1,-2
不能算在最大和的连续子数组中。 - 2.从3开始向后加
3+6+9=18
,18+(-4)=14
,14+5=19
大于5本身,说明可以负数-4
可以算在最大和的连续子数组中(既当前子数组和为负数)
- 3.
19+5+2=26
,所以最大子数组的和为26 - 4.算最大子数组和的时候,
主要是当遇到负数的时候
,比较前面的和加上负数之后和负数之后的那个数,那个数字比较大。如果和比较大,则负数可以算在之内;如果负数之后的那个数大,是不能算在最大和连续子数组之内的。
我们可以根据上边的思路写出代码:
代码实现:
int g_InvalidInput = 0;//用全局变量标识返回的值是有效值还是无效值
int GetSumCosArr(int *num, int len)
{
//数组为空,或者长度小于等于0则无效输出
if (num == NULL || len <= 0)
{
g_InvalidInput = 1;
return 0;
}
int cur_sum = 0;//记录当前子数组和
int max_sum = 0;//记录当前最大子数组和
for (int i = 0; i < len; i++)
{
//以测试为例,1和-2加起来为-1在加3等于2小于3的值,也就是说前面的子数组小于第二个子数组的和
//所以要从3开始
if (cur_sum <= 0)
cur_sum = num[i];
else
cur_sum += num[i];
//比较确定最大值
if (cur_sum > max_sum || max_sum == 0)
{
max_sum = cur_sum;
}
}
return max_sum;
}