我尝试了Codility任务' TaskEquilibrium'并且根据Corectness标准仅获得33%。您可以在以下链接中查看我的C ++代码以及问题陈述:
https://codility.com/demo/results/trainingAPHQW7-UVM/
我在问题中的方法是首先计算数组元素的总和。然后我在每次迭代中找到差异(第一次迭代的方式不同)并更新最小绝对值。
我能够检查上述测试用例,但没有收到其他一些案例的正确答案。
请查看我的代码并告知算法错误在哪里。 提前谢谢。
答案 0 :(得分:-2)
您逻辑中的一个重大缺陷是,您认为P
至少为1,但有些情况P = 0
会给您最小的差异。
e.g。对于[1,-1]
的列表,您需要P=0
,以便它为您[]
和[1,-1]
提供最小差异0
另一个问题是,当你遍历每个元素时,你还没有更新diff
(diff
总是sum of A[1..N] - A[0]
),因此temp = diff + 2*A[p-1];
不会在p > 2
时给你有意义的结果。
你的循环看起来像(pesudo-code):
minDiff = sum;
diff = sum;
for each (int a in A) {
diff -= (a * 2);
if (abs(diff) < minDiff) {
minDiff = abs(diff);
}
}
最好只保留这样的差异,但如果它让你困惑,为什么不简单地保留两个var,例如sumOfFirstSection = 0; sumOfSecondSection = sum
,并为A[]
中的每个元素设置循环,然后执行sumOfFirstSection += A[i]; sumOfSecondSection -= A[i]
并相应地推导出差异?