【发布时间】:2011-06-23 02:38:33
【问题描述】:
编程珍珠第8栏发现的问题如下:
给定实向量 x[n],计算在任何连续子向量中找到的最大和。
提供的最终解决方案的复杂度为 O(n),如下所示:
std::vector<int> x;
int max_so_far = 0;
int max_here = 0;
for (std::size_t i = 0; i < x.size(); ++i)
{
max_here = std::max(max_here + x[i], 0);
max_so_far = std::max(max_so_far, max_here);
}
我想知道如何修改上述算法以提供最小总和。
【问题讨论】:
-
设置 x[n] = -x[n] 并运行最大总和...
-
您可以将所有向量元素乘以 -1,通过上面的代码运行向量,然后再次将找到的总和乘以 -1。
-
@Reyzooti - 我有一个疑问。术语“子向量”是否仅包括从位置 0 开始的向量?
-
如果您的向量包含所有负数,您的代码将失败。它将报告最大值为 0。通过使
max_so_far的初始值等于最小整数来更正。 -
@Jim:如果子向量可能包含长度为零的子向量,那么当所有数字为负时,0 确实是最大和。所以是正确的。
标签: c++ algorithm programming-pearls