您的位置:首页 > 职场人生

连续子数组的最大和

2017-08-22 17:21 232 查看
/*

面试题31:连续子数组的最大和

:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n).

*/

/*

解题思路:1.例如一个数组{5,2,-10,7,2,-1},先初始化和为0,从第一个数字开始累加,此时的和就是第一个数字5,

2.此时再继续加,当加到第二个数字和为7,判断这个数字是否大于之前的和,如果大于,将最大值更新为7

3.继续加第三个数字,和为-3,此时需要判断和是否大于0,如果小于等于0,我们需要舍弃之前的和,现在-3<0,我们从7开始重新累加,此时最大值依旧为7.

4.7和2相加后和为9,于是将最大值更新为9,再继续加之后变为8,由于8小于9,于是我们返回值为9

*/

#include<iostream>

using namespace std;

#if 1
int FindGreatestSumOfArray(int *pData,int nLength)
{
bool IsInvalidArr = false;  //判断数组是否有效
if(pData == NULL ||nLength == 0)
{
IsInvalidArr == true;
}
int nCurnum = 0;
int nGreatestSum = 0x80000000;
for(int i = 0;i<nLength;i++)
{
//如果当前累加和小于0,则舍弃当前的和,从下一个数字开始。
if(nCurnum <=0)
nCurnum = pData[i];
//否则的话一直累加
else
nCurnum+=pData[i];
//此处需要每次更新累加和,保证最后得到的是最大的累加和
if(nCurnum >nGreatestSum)
nGreatestSum = nCurnum;
}
return nGreatestSum;
}

int main()
{
//int arr[] = {1,-2,3,10,-4,7,2,-5};
int arr[] = {5,2,-10,7,2,-1};
int length = sizeof(arr)/sizeof(int);
int sum;
sum = FindGreatestSumOfArray(arr,length);
cout<<sum<<endl;
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息