剑指offer 连续子数组的最大和
第一次使用的方法是依次遍历每一个字串,然后记录最大值就可以了,但是这样的话,算法的时间复杂度为O(n2)
很显然这样做不是最优解
int FindGreatestSumOfSubArray(vector<int> array)
{
if(array.size()==0)
return 0;
int maxVal=array[0];
int sum=0;
for(int i=0; i<array.size(); i++)
{
sum=0;
for(int j=i; j<array.size(); j++)
{
sum+=array[j];
maxVal = max(maxVal, sum);
}
}
return maxVal;
}
改进之后的算法时间复杂度为O(n),用一个sum来记录字串的和,如果当前字串和负数的话,那么就要将sum直接赋值为array[i] ,
因为如果sum为负数的话,当前 array【i】为负数那么sum只会更小,如果array【i】为正的话,那么从array【i】开始则更可能会
找到更大的子串
int FindGreatestSumOfSubArray(vector<int> array) {
int maxVal=array[0];
int sum=maxVal;
for(int i=1; i<array.size(); i++)
{
if(sum<0)
sum=array[i];
else
sum+=array[i];
maxVal = max(maxVal, sum);
}
return maxVal;
}