连续子数组的最大和
来源:互联网 发布:在管委会上班好吗知乎 编辑:程序博客网 时间: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
- 数组连续子数组的和最大
- 数组连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- (8)连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- Lock中Condition的实现
- 超时的理解:
- Makefile编写实例(生成可执行文件)
- 好的问题能够引导好的创新:
- 写写我理解的递归
- 连续子数组的最大和
- 容量规划经验谈:
- 解决更新yum源的时候报错404的问题
- 更高的抽象,更高的格局:
- Unity3d之设计模式(四)外观模式
- 搞清楚局部和全部,搞清楚逻辑和物理,搞清楚这些对于理解一些组件的概念是非常有意义的:
- 响应中断的锁与定时锁的实现原理
- 使用adb从Android中pull文件到windows
- 如何快速认识一个组件: