// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整 // 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 #include <iostream> 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)//如果当前累加和小于0,还不如从下个节点开始 nCurSum = pData[i]; else//否则就加上下个节点 nCurSum += pData[i]; if (nCurSum > nGreatestSum)//只记录其中的最大值 nGreatestSum = nCurSum; } return nGreatestSum; } // ====================测试代码==================== void Test(const char* testName, int* pData, int nLength, int expected, bool expectedFlag) { if (testName != nullptr) printf("%s begins: ", testName); int result = FindGreatestSumOfSubArray(pData, nLength); if (result == expected && expectedFlag == g_InvalidInput) printf("Passed. "); else printf("Failed. "); } // 1, -2, 3, 10, -4, 7, 2, -5 void Test1() { int data[] = { 1, -2, 3, 10, -4, 7, 2, -5 }; Test("Test1", data, sizeof(data) / sizeof(int), 18, false); } // 所有数字都是负数 // -2, -8, -1, -5, -9 void Test2() { int data[] = { -2, -8, -1, -5, -9 }; Test("Test2", data, sizeof(data) / sizeof(int), -1, false); } // 所有数字都是正数 // 2, 8, 1, 5, 9 void Test3() { int data[] = { 2, 8, 1, 5, 9 }; Test("Test3", data, sizeof(data) / sizeof(int), 25, false); } // 无效输入 void Test4() { Test("Test4", nullptr, 0, 0, true); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); system("pause"); return 0; }