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

Running-time complexity of two nested loops: quadratic or linear?

本文关键字:二次 线性 时间复杂性 两个 嵌套循环 运行      更新时间:2023-10-16
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(,但它仍然被接受了。所以,我有疑问,请告诉我正确的答案。

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

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

因此,对于这种最坏情况场景,在内部循环中执行的比较次数为(通过计算以下算术级数的总和(:

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

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