连续子数组的最大和

来源:互联网 发布:在管委会上班好吗知乎 编辑:程序博客网 时间:2024/04/30 05:31

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

详细的实现代码如下:


bool g_InvalidInput = false;//解法一:举例分析数组的规律int FindGreatestSumOfSubArray(int *pData, int nLength){    if((pData == NULL) || (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];        else            nCurSum += pData[i];        if(nCurSum > nGreatestSum)            nGreatestSum = nCurSum;    }    return nGreatestSum;} // ====================测试代码====================void Test(char* testName, int* pData, int nLength, int expected, bool expectedFlag){    if(testName != NULL)        printf("%s begins: \n", testName);    int result = FindGreatestSumOfSubArray(pData, nLength);    if(result == expected && expectedFlag == g_InvalidInput)        printf("Passed.\n");    else        printf("Failed.\n");}// 1, -2, 3, 10, -4, 7, 2, -5void Test1(){    int data[] = {1, -2, 3, 10, -4, 7, 2, -5};    Test("Test1", data, sizeof(data) / sizeof(int), 18, false);}// 所有数字都是负数// -2, -8, -1, -5, -9void Test2(){    int data[] = {-2, -8, -1, -5, -9};    Test("Test2", data, sizeof(data) / sizeof(int), -1, false);}// 所有数字都是正数// 2, 8, 1, 5, 9void Test3(){    int data[] = {2, 8, 1, 5, 9};    Test("Test3", data, sizeof(data) / sizeof(int), 25, false);}// 无效输入void Test4(){    Test("Test4", NULL, 0, 0, true);}int _tmain(int argc, _TCHAR* argv[]){    Test1();    Test2();    Test3();    Test4();    return 0;}

解法二:应用动态规划方法


0 0
原创粉丝点击