面试题31:连续子数组的最大和
来源:互联网 发布:编程语言最新排名 编辑:程序博客网 时间:2024/04/29 16:30
/*题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。*/#include <iostream>using namespace std;bool g_InvalidInput = false;int FindGreatestSumofSubarrary(int a[], int n){ //处理无效输入 if(a == NULL || n <= 0) { g_InvalidInput = true; return 0; } int CurrentSum = 0; int MaxSum = 0x80000000;//-2147483648 int start = 0; int end = 0; //遍历数组 for(int i = 0; i < n; ++i) { if(CurrentSum <= 0) { CurrentSum = a[i]; start = i; }else { CurrentSum += a[i]; } if(CurrentSum > MaxSum) { MaxSum = CurrentSum; end = i; } } if(start <= end) { for(int k = start; k <= end; ++k) cout << a[k] << " "; }else { cout << a[end]; } cout << endl; cout << MaxSum << endl; return MaxSum;}//=================测试代码================void Test(char *TestName, int a[], int n, int expectedresult, bool expectedflag){ if(TestName != NULL) cout << TestName << " begins: " << endl; int result = FindGreatestSumofSubarrary(a, n); if(result == expectedresult && g_InvalidInput == expectedflag) cout << "Passed!" << endl; else cout << "Failed!" << endl;}//===============测试用例=================void Test1(){ int data[] = {1, -2, 3, 10, -4, 7, 2, -5}; Test("Test1", data, sizeof(data) / sizeof(int), 18, false);}//全是负数void Test2(){ int data[] = {-2, -8, -1, -5, -9}; Test("Test2", data, sizeof(data) / sizeof(int), -1, false);}//全是正数void 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 main(){ Test1(); Test2(); Test3(); Test4(); return 0;}