《剑指offer》第四十二题:连续子数组的最大和
// 面试题42:连续子数组的最大和 // 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整 // 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 #include <cstdio> bool g_InvalidInput = false; int FindGreatestSumOfSubArray(int* pData, int nLength) { if ((pData == nullptr) || (nLength <= 0)) { g_InvalidInput = true; return 0; } g_InvalidInput = false; int nSum = 0; //当前累加和 int nGreatestSum = 0x80000000; //历史最大和, 此时考虑全为负值情况 for (int i = 0; i < nLength; ++i) { if (nSum <= 0) nSum = pData[i]; //如果和小于0, 当前值作为最大值 else nSum += pData[i]; //否则继续累加 if (nSum > nGreatestSum) nGreatestSum = nSum; } 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.\n"); else printf("Failed.\n"); } // 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(); return 0; }
分析:动态规划还不太懂。
class Solution { bool g_IsInvalid = false; public: int FindGreatestSumOfSubArray(vector<int> array) { int length = array.size(); if (array.empty()) { g_IsInvalid = true; return 0; } int nCurSum = 0; int nGreatestSum = 0x80000000; for (int i = 0; i < length; ++i) { if (nCurSum <= 0) nCurSum = array[i]; else nCurSum += array[i]; if (nCurSum > nGreatestSum) nGreatestSum = nCurSum; } return nGreatestSum; } };