我认为下面代码的时间复杂度是O(n ^ 2)或O(n * logn)。
int j = 0;
for(i = 0; i < n; ++i) {
while(j < n && arr[i] < arr[j]) {
j++;
}
}
但是,答案页面显示为O(n) 我不明白为什么会这样 我(愚蠢)的意见如下:
n
次。 arr[i] < arr[j]
可能会影响while
循环,但这无关紧要。n
次,因为arr[j]
在循环期间可能小于arr[i]
。因此,while
循环将运行log(n)
次。你能解释为什么我的答案错了,为什么正确的时间复杂度是O(n)?
答案 0 :(得分:3)
SUM
循环for(i = 0; i < n; ++i)
次。
n
总共累计<{1}}次 。请注意,while(j < n && arr[i] < arr[j]) {
j++;
}
仅在n
的整个循环中递增,因此它是一个内循环并不会使其更高阶,因为它仍然只能来自j
} i
为整套循环。
所以0
= n
答案 1 :(得分:0)
一般来说,要了解这样的流程,请尝试添加print语句以了解流程,打印&#39; i&#39;和&#39; j&#39;在每一点上。
在这种特定情况下,您知道触发外部for
循环的次数,但尝试查看可以递增的总次数j
。即使它位于for
循环内,它的总迭代次数也可能是独立的。