【发布时间】:2015-12-02 22:11:11
【问题描述】:
我在 C++ 中做了一个测试,要求一个函数返回一个索引,该索引将输入向量分成具有相同元素总和的两部分,例如:对于vec = {1, 2, 3, 5, 4, -1, 1, 1, 2, -1},它可能返回 3,因为 1+2+3 = 6 = 4-1+1+1+2-1。所以我已经完成了返回正确答案的函数:
int func(const std::vector< int >& vecIn)
{
for (std::size_t p = 0; p < vecin.size(); p++)
{
if (std::accumulator(vecIn.begin(), vecIn.begin() + p, 0) ==
std::accumulator(vecIn.begin() + p + 1, vecIn.end(), 0))
return p;
}
return -1;
}
我的问题是当输入是一个很长的向量时,它只包含 1(或 -1),函数的返回很慢。所以我想到了从中间开始搜索想要的索引,然后左右走。但我认为最好的方法是索引在合并排序算法顺序中,这意味着:n/2、n/4、3n/4、n/8、3n/8、5n/8、7n/ 8... 其中 n 是向量的大小。有没有办法在公式中写下这个顺序,以便我可以在我的函数中应用它?
谢谢
编辑 在一些 cmets 之后,我不得不提到我几天前已经完成了测试,所以我忘了放并提到没有解决方案的部分:它应该返回 -1...我也更新了问题标题。
【问题讨论】:
-
通过累计求和,您可以在
O(n)中完成工作。 -
我不太理解评论...
-
如果提到
std::partial_sum,评论会更清楚。您一遍又一遍地重复进行相同的计算。也就是说,这有助于意识到您正在寻找LeftHalf(i) = RightHalf(i),因为Total = LeftHalf(i) + RightHalf(i)是任何i,它遵循Total = 2 * LeftHalf(i)。您根本不需要累积总和。 -
我认为您应该考虑改写问题,因为到目前为止,所有答案都告诉您如何解决实际问题,但它们并没有真正提到标题中的问题或您提出的问题在你的最后一句话。好像是典型的XY problem...
-
@Gombat:甚至不需要负数。
{1 0 1}已经是模棱两可了。如果您允许空子集,{0}已经是不明确的(即,如果输入长度为 1,则没有唯一解,因为当 n!=0 时输入 {n} 没有解)