我不确定如何根据输入大小N确定运行时间,特别是当它进入具有某些限制的循环时。这就是我的尝试。我猜测常数是正确的。它看起来怎么样?
i = 1; //1
k = n; //1
while (i <= k) { //N+1
while (i <= k && A[i] < 0) { //i+2
i = i + 1; //2i
}
while (i <= k && A[k] >= 0) { //i+2
k = k - 1; //2i
}
printf("..."); //1
i = i + 1; //1
k = k - 1; //1
}
答案 0 :(得分:3)
这被称为从两端燃烧蜡烛。 i
和k
将在中间的某个地方相遇,但数组中的每个元素只访问一次。所以运行时间是 O(n)。
外部while
循环只是等待进程完成,因此不会考虑运行时间的计算。第一个内部while
循环向右移动i
直到它卡住。第二个内部while
循环向左移动k
直到它被卡住。
行
i = i + 1;
k = k - 1;
将i
和k
移到他们卡住的点之后。
结果是i
访问了一些数组元素,k
访问了其他数组元素,但数组的每个元素只访问过一次。