题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。并记录最大子数组的位置。
思路:当加上一个整数时,和会增大,当加上一个负数时,和会减小,当和为负数时舍弃前面的计算,从下个位置重新开始。
代码:
int findMax( int a[ ] , int size ,int *start, int *end )
{
int tempmax = max = 0;
*start = *end = 0;//记录最大子数组起始结束位置;
for( int i = 0; i < size ; i++ )
{
tempmax = tempmax + a[i] ;
if( tempmax < 0 )//舍弃前面的计算,重新开始
{
tempmax = 0 ;
*start = i + 1 ;
*end = i + 1;
}
if( tempmax > max)
{
max = tempmax ;
*end = i ;
}
}
if( max == 0 )//全部为负数
{
max = a[0] ;
for( int i = 1; i < size ; i++ )
{
max = max > a[i] : max ? a[i] ;
}
}
retrun max ;
}