在编程珠玑里看到的,就随手写了一个,运行时间是O(n*n)后期再优化。
#include <iostream>
int calcMax(int array[], int length , int &start , int &end)
{
int sumMax = array[0];
for (int i = 0; i < length; ++i)
{
int sumVal = 0;
for (int j = i; j < length; ++j)
{
sumVal += array[j];
if (sumMax < sumVal)
{
sumMax = sumVal;
start = i;
end = j;
}
}
}
return sumMax;
}
void main()
{
int array[] = { -1 , 5 , -3 , -4 , 5 , 6 , 7 , -8 , 9 , -10 };
int lenght = sizeof(array) / sizeof(int);
int start = 0, end = 0;
int maxsum = calcMax(array, 10 , start , end);
std::cout << "子向量的起始和终止位置为:[" << start << "," << end << "]\n";
std::cout << "连续子向量的最大求和:" << maxsum << std::endl;
std::system("pause");
}
下面给一个运行时间为O(n)的代码:
int calcMax(int array[], int length)
{
int maxsofar = 0;
int maxendinghere = 0;
for (int i = 0; i < length; ++i)
{
maxendinghere = std::max(array[i] + maxendinghere, 0);
maxsofar = std::max(maxendinghere, maxsofar);
}
return maxsofar;
}