42.连续子数组中的最大和
题目:输入一个整形数组,数组里有正数也有负数。
数组中一个或者连续多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)
例如:{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,4,7,2}.因此输出该数组和为18
步骤 | 操作 | 累加的子数组和 | 最大的子数组和 |
1 | 加1 | 1 | 1 |
2 | 加-2 | -1 | 1 |
3 | 抛弃前面的和-1,加3 | 3 | 3 |
4 | 加10 | 13 | 13 |
5 | 加-4 | 9 | 13 |
6 | 加7 | 16 | 16 |
7 | 加2 | 18 | 18 |
8 | 加5 | 13 | 18 |
#include<iostream>
using namespace std;
//定义个bool型变量 来判断返回值是数组结果还是空指针
bool g_InvalidInput = false;
int FindGreatestSumOfSubArray(int *pData, int nLength){
if (pData == nullptr || nLength <= 0){
g_InvalidInput = true;
return 0;
}
g_InvalidInput = false;
int nCurSum = 0;
int nGreatestSum = 0x80000000;
for (int i = 0; i < nLength; i++){
if (nCurSum>0)
nCurSum += pData[i];
//如果mCurSum小于0 则舍弃之前累加和 并保存当前数值
else
nCurSum = pData[i];
if (nCurSum > nGreatestSum)
nGreatestSum = nCurSum;
}
return nGreatestSum;