连续子数组的最大和

来源:互联网 发布:上瘾网络剧类似的 编辑:程序博客网 时间:2024/06/04 19:09

/*
面试题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 1int 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
原创粉丝点击