我有一个在 O(end - start) 中运行的循环,我想用 O(1) 替换它。
如果“宽度”不会减少,那就很简单了。
for (int i = start; i <= end; i++, width--)
if (i % 3 > 0) // 1 or 2, but not 0
z += width;
开始,结束和宽度具有正值
最佳答案
正如其他人所提到的,这可能最容易被认为是两个系列的总和。
x x+3 x+6 ... x+3N
+ x+3N x+3(N-1) x+3(N-2) ... x
-----------------------------------
2x+3N 2x+3N 2x+3N ... 2x+3N
以上可以简化为
(2x+3N)(N+1)
这意味着其中之一的总和真的是......
(2x+3N)(N+1)/2
这个方程需要应用于两个系列。两者的 N 可能不同。
因此,您所要做的就是确定您的起点以及系列中的项目数量。这将留给学生作为练习。
希望这可以帮助。
关于c - 用公式替换 for 循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2609878/