You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该算法的时间复杂度为O(N)而非O(N²)?

为什么这段代码的时间复杂度是O(N)而非O(N²)

先看你给出的代码:

int j = 0;
for (int i = 0; i < N; i++) {
    while ((j < N - 1) && (A[i] - A[j] > D))
        j++;
    if (A[i] - A[j] == D) return 1;
}

你觉得时间复杂度是O(N²),核心误区是误以为每次外层循环时,内层while的j都会从0开始重新遍历N次,但实际上j的变化是单向递增的——它只会往大了走,永远不会被重置为0或者更小的数值。

具体来说:

  • j的初始值是0,整个程序运行过程中,j最多只会从0递增到N-1,总递增次数最多是N次。
  • 外层for循环执行N次,但内层while循环的总迭代次数加起来不会超过N次,因为j每递增一次就离上限近一步,不会重复遍历之前的位置。

把外层循环的N次操作,加上内层while的总N次操作,总的时间复杂度就是O(N),而不是O(N²)。

内容的提问来源于stack exchange,提问作者Resistances in Parallel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:34:52