两个嵌套循环的运行时复杂度:二次还是线性?

时间:2018-07-11 13:33:11

标签: c++ algorithm big-o

int Solution::diffPossible(vector<int> &A, int B) {
    for (int i = 0; i < A.size(); i++) {
       for (int j = i+1; j < A.size(); j++)
          if ((A[j]-A[i]) == B)
             return 1;      
    }
    return 0;
}

这是一个简单问题的解决方案,在该问题中,我们应该编写时间复杂度小于或等于O(n)的代码。我认为这段代码的时间复杂度为O(n ^ 2),但仍然被接受。因此,我有疑问请告诉我正确的答案。

1 个答案:

答案 0 :(得分:2)

让我们分析最坏的情况,即,当内循环if中的(A[j]-A[i]) == B语句的条件从未得到满足时,因此语句return 1从未被满足被执行。

如果我们将A.size()表示为n,则对内循环的比较将对外循环的第一次迭代执行n-1次,然后对n-2次进行比较第二次迭代,依此类推...

因此,对于此最坏情况场景,在内循环中执行的比较次数为(通过计算以下所得arithmetic progression的总和):

n-1 + n-2 + ... + 1 = (n-1)n/2 = (n^2 - n)/2
^                 ^
|_________________|
     n-1 terms

因此,运行时复杂度是二次的,即O(n ^ 2),而不是O(n)。