为什么这道题的大O时间复杂度是C?

Why is the big O time complexity for this questions is C?

The screenshot of the question

我的计算是:

 statement              | time 
------------------------|--------
var value = 0;          | 1
for(var i=0;i<n;i++)    | 1 + (n+1) + n 
for(var j=0;j<i;j++);   | n + n*(n(n+1)/2 +1) + n* n(n+1)/2
value += 1;             | n*(n(n+1)/2 

让我们看看最初的几次迭代计数。

i (counter)           j (# of iterations for each value of i)
0th                   0
1st                   1
2nd                   2
.                     .
.                     .
(n-1)th               n-1

现在前 N 个整数的总和定义为 n(n+1)/2,其中范围从 1 开始,一直到 n。更多详情 here.

在我们的例子中,范围从 0 开始,一直到 n-1(上面的 RHS table)。将求和公式中的 n 替换为 n-1,得到 n(n-1)/2.

Big O 的复杂度是 O(n*n),所以 n 的平方。

运算次数为n(n-1)/2

Big O 复杂度忽略常量和低阶项。

问题表述不当,因此没有准确答案。事实上,作者并没有说哪个操作“重要”。例如,当i=0时,内层循环执行一次(至少初始化和测试),而它的循环体则不执行。

现在如果我们只计算 value 的递增次数,最内层的循环恰好执行其中的 i 个,而外层循环使 i 从 0 变为 n-1。因此总共有 Tn-1 = n(n-1)/2(三角数)。