最小和子向量的算法

时间:2011-02-07 23:25:39

标签: c++ algorithm programming-pearls

编程珍珠专栏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);
}

我想知道如何修改上述算法以提供最小和

1 个答案:

答案 0 :(得分:2)

您只需要反转x中每个元素的符号,然后运行算法:

std::vector<int> x;
int max_so_far = 0;
int max_here = 0;

for (std::size_t i = 0; i < x.size(); ++i) x[i] = -x[i];

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);
}

int min_so_far = -max_so_far;