题目:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个正数组成一个子数组,每个子数组中都有一个和。
求所有子数组中的和的最大值。要求时间的复杂度为 O(n)。
分析:首先从前往后遍历,叠加求和,每迭代一次保存一次当前最大值,若某次叠加求和的结果为负数,则将求和变量重新赋值为 0,从当前位置继续按照之前的逻辑往后遍历求和。
/*
* ipInput: input array
* iSize: size of input array
* @return: vector<int>: first element is max sum,
* second element is start index of max sum,
* and third element is end index
*/
vector<int> GetMaxValueOfArray(const int* ipInput, int iSize)
{
vector<int> lResultStruct;
int lSumOfSubArray = 0;
int lMaxSumOfSubArray = 0;
int lStartIndex = 0, lStartIndexTemp = 0, lEndIndex = 0;
for (int i = 0; i < iSize; ++i)
{
lSumOfSubArray += ipInput[i];
if (lSumOfSubArray > lMaxSumOfSubArray)
{
lMaxSumOfSubArray = lSumOfSubArray;
lStartIndex = lStartIndexTemp;
lEndIndex = i;
}
if (lSumOfSubArray <= 0)
{
lSumOfSubArray = 0;
lStartIndexTemp = i + 1;
}
}
lResultStruct.push_back(lMaxSumOfSubArray);
lResultStruct.push_back(lStartIndex);
lResultStruct.push_back(lEndIndex);
return lResultStruct;
}