【发布时间】:2023-04-07 13:05:01
【问题描述】:
我认为下面代码的时间复杂度是 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)。
我不明白为什么会这样。
我的(愚蠢的)意见如下:
- 时间复杂度为 O(n^2),因为有两个循环运行
n次。arr[i] < arr[j]可能会影响while循环,但没关系。 - 时间复杂度为 O(n*logn),因为 while 循环可能运行少于
n次,因为在循环期间arr[j]可能小于arr[i]。因此,while循环将运行log(n)次。
你能解释一下为什么我的答案是错误的,为什么正确的时间复杂度是 O(n)?
【问题讨论】:
-
请注意 j 较新的重置为 0。所以内部循环总共只能运行 O(n) 次
-
内部循环将只运行一次,因为您没有将 j 重新初始化为 0。
标签: c++ c algorithm time-complexity complexity-theory