題目:輸入一個整形數組,數組裡有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間復雜度為O(n)。
例如輸入的數組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組為3, 10, -4, 7, 2,因此輸出為該子數組的和18。
[cpp]
/****************************************************************
當我們加上一個正數時,和會增加;當我們加上一個負數時,和會減少。
如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,
不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下代碼。
*****************************************************************/
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;
//0x80000000表示最小值-2147483648,考慮到全部輸入為負數
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;
}
return nGreatestSum;
}
int fun(int a[],int size)
{
int sum=0;
int max=0;
for(int i=0;i<size;i++)
for(int j=i;j<size;j++)
{
for(int k=i;k<=j;k++)
{
sum+=a[k];
}
if(sum>max)
max=sum;
sum=0;
}
return max;
}
int main()
{
int a[8]={1, -2, 3, 10, -4, 7, 2, -5};
// int max1=fun(a,8);
int max=FindGreatestSumOfSubArray(a,8);
cout<<max<<endl;
return 0;
}