题目:
输入一个整形数组,数组里面有正数也有负数,数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值,时间复杂度为O(n).
例如:输入的数组为{1,-2,3,10-4,7,2,-5},则和的最大子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.
本题考查知识点:数组、动态规划
本题难度:初级
#include <stdlib.h>
#include <string.h>
#include "oj.h"
/*
功能:
输入:pIntArray:数组,nCout:数组长度
输出:
返回:返回最大值
*/
int GetSubArraySum(int* pIntArray, int nCount)
{
/*在这里实现功能*/
bool g_InvalidInput = false;//用全局变量标记是否为无效输入
if((pIntArray == NULL)||(nCount <= 0))
{
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
int nCurSum = 0;
int nGreatestSum = 0x80000000;//初始值设置为很小的负数
for(int i=0;i<nCount;i++)
{
if(nCurSum<=0)//如果子数组的和为负数,下一个数n加上这个和后,会比n本身小,因此摒弃掉之前累加的子数组和
{
nCurSum = pIntArray[i];
}
else
{
nCurSum += pIntArray[i];
}
if(nCurSum > nGreatestSum)
{
nGreatestSum = nCurSum;
}
}
return nGreatestSum;
}