sop*_*sop 7 c++ algorithm vector
我在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;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当输入是一个只包含1(或-1)的非常长的向量时,函数的返回很慢.所以我想到从中间开始搜索想要的索引,然后左右移动.但我认为最好的方法是索引处于合并排序算法顺序,即:n/2,n/4,3n/4,n/8,3n/8,5n/8,7n/8 ...其中n是向量的大小.有没有办法在公式中写这个顺序,所以我可以在我的函数中应用它?
谢谢
编辑 经过一些评论我不得不提到我几天前已经完成了测试,所以我忘了提及没有解决方案的部分:它应该返回-1 ...我已经更新了问题标题.
小智 10
专门针对这个问题,我会使用以下算法:
这给出了ao(n)算法而不是o(n2)