题目:
输入一个整形数组,数组里面有正数也有负数。数组中一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值。
例,输入:{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},所以输出为18.
解析:
最直观的方法,枚举。子数组的起点和终点各有n种选择方法,一共有n*(n+1)/2个子数组,所以时间复杂度为O(n^2)。
初始起点为首元素。
初始终点为首元素。
初始和为首元素。
初始最大和为最小的负整数。(原码、反码、补码,计算机中负数的表示)
当起点和终点之间的元素之和小于0,移动起点到终点之后,移动终点重新开始找新的子段。在找的过程中更新最大和。(如果前部分元素之和小于0,加上后部分元素之和,总和必然小于单纯的后部分之和,所以直接舍弃小于0的前部分元素)。
代码如下:
#include<iostream>
using namespace std;
int findMaxSubSum(int *pArr, int nLength)
{
if(NULL == pArr || nLength<=0)
{
return -1;
}
int curSum = 0;
int maxSubSum = 0x80000000;
for(int i=0; i<nLength; i++)
{
if(curSum<=0)
curSum = pArr[i];
else
curSum += pArr[i];
if(curSum > maxSubSum)
maxSubSum = curSum;
}
return maxSubSum;
}
int main()
{
int a[] = {1,-2,3,10,-4,7,2,-5};
cout<< findMaxSubSum(a,8)<<endl;
getchar();
return 0;
}
结果