题目:
输入一个整型数组,元素有整有负,如{1,-2,3,10,-4,7,2,-5}。求连续子数组和的最大值,时间复杂度O(n)。
题解:
遍历数组元素并求和,用变量maximum记录出现过的和的最大值,用curMaximum记录当前和的最大值,当curMaximum小于0时,curMaximum+下一个元素 < 下一个元素,可直接将curMaximum设为下一个元素值,若curMaximum > maximum,修改maximum为curMaximum。
class Solution {
public:
Solution():isValidInput(true){}
int FindGreatestSum( int* inputArray, int length )
{
if(!inputArray)
{
isValidInput = false;
return 0;
}
int maximum = 0x80000000;
int curMaximum = 0;
for(int i = 0; i < length; i++)
{
if(curMaximum < 0)
curMaximum = inputArray[i];
else
curMaximum += inputArray[i];
if(curMaximum > maximum)
maximum = curMaximum;
}
return maximum;
}
bool isValidInput;
};
动态规划思想:
curMax[i] = Data[i] if curMax[i-1] < 0 or i = 0;
curMax[i] = Data[i] + curMax[i-1] if i > 0 && curMax[i-1] >= 0
最后找最大的curMax[i],或者在计算过程中用变量保存全局maximum。