求陣列中和最大的子陣列並輸出子陣列序列
阿新 • • 發佈:2018-12-25
輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。輸出和最大的子陣列。要求時間複雜度為O(n)。
例如輸入的陣列為A={0,-6,3,5,-1,2},和最大的子陣列為{3,5,-1,2},因此輸出為該子陣列的和9。
將陣列分為三個部分:i之前,i,i之後;
i之後是待確定的子陣列;
i之前是已經確定的子陣列;
i是待加入的元素;
nStart表示包含A[i]的和最大的子陣列;
nAll表示不包含A[i]的和最大的子陣列;
如果nStart<0,拋棄前面的子陣列(該子陣列不是和最大的子陣列),從i+1的位置開始尋找子陣列;
如果nStart > nAll ,A[i]加入子陣列;
int MaxSum(int *A, int n) { assert(A && n > 0); int nStart = A[0]; int nAll = A[0]; int begin = 0; int end = 0; for (int i = 0; i <= n - 1; i++) { /* 0,-6 拋棄,重新尋找 3,5,-1,2 */ if (nStart < 0) { begin = i; nStart = 0; } nStart += A[i]; if (nStart > nAll) { end = i; nAll = nStart; } } if (nAll >= 0) { for (int i = begin; i <= end; i++) { cout << A[i] << " "; } cout << endl; return nAll; } else { cout << nAll << endl; return nAll; } }
void Test()
{
int a[] = { 0, -6, 3, 5, -1, 2 };
//int a[] = { -5, -1, -3, -5, -1, -2 };
cout << MaxSum(a, sizeof(a) / sizeof(a[0])) << endl;
}