在编程珠玑里看到的,就随手写了一个,运行时间是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;
}
本文提供了两种计算子数组最大和的算法实现,一种是简单的O(n^2)方法,另一种则是更高效的O(n)解决方案。O(n^2)的方法通过双重循环遍历所有可能的子数组来找出最大和,而O(n)的算法则使用了动态规划的思想,只遍历一次数组即可得到结果。
5997

被折叠的 条评论
为什么被折叠?



