这是一个算法。因为它只是一个for循环我会把它看作O(N),但我被告知它是O(N2)。我被告知这是因为list.add,但这不会改变N?那么为什么时间复杂度会发生变化?
public static void mystery3(List<String> list) {
for (int i = 0; i < list.size() - 1; i += 2) {
String first = list.remove(i);
list.add(i + 1, first);
}
}
答案 0 :(得分:2)
如果您正在使用数组(Arraylist),remove(i)
需要O(n)而add(...)
需要O(n)。这是因为在索引i处查找元素需要O(1)但调整大小需要O(n)。
如果使用链表,remove(i)
取O(n),'add(...)取O(n)。这是因为在索引i处查找元素需要O(n)并且删除需要O(1)。
由于您调用方法n / 2次,因此其整个运行时间为O(n ^ 2)。