《剑指offer》面试题31:
题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成的一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)。
分析:一个变量保存目前的子数组的和,一个变量保存目前最大的子数组的和。当遍历到某一个值时,如果第一个变量值变为负数,则将其舍掉,继续往下遍历;如果当前子数组的和大于保存的最大子数组的和,将当前子数组的和赋值给第二个变量。这样复杂度为O(n)。
代码:
注释掉的为《剑指offer》中的代码,其中最大子数组的和初始化为0x8000 0000,int型的最小范围是-2^31~2^31,0x8000 0000是int型表示最小范围时的负数最小值,感觉这样初始化不好,未注释的是自己写的代码。
bool g_InvalidInput = false;
int FindGreatestSumOfSubArray(int *pData, int nLength)
{
if((pData == NULL) || (nLength <= 0))
{
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
/*int nCurSum = 0;
int nGreatestSum = 0x80000000;
for(int i = 0; i < nLength; ++i)
{
if(nCurSum <= 0)
nCurSum = pData[i];
else
nCurSum += pData[i];
if(nCurSum > nGreatestSum)
nGreatestSum = nCurSum;
}*/
//修改
int nCurSum = pData[0];
int nGreatestSum = pData[0];
for( int i = 1; i < nLength; ++i )
{
nCurSum += pData[i];
if( nCurSum < 0 )
{
nCurSum = 0;
}else if(nCurSum > nGreatestSum)
{
nGreatestSum = nCurSum;
}
}
return nGreatestSum;
}