我在编程实践网站上找到了这个解决方案,它说复杂性是O(N)。但是,它看起来更像是O(N ^ 2)。有人可以告诉我为什么这是O(N)?
public static void transposeMatrix(int[][] matrix) {
int n = matrix.length - 1;
int temp = 0;
for(int i = 0; i <= n; i++){
for(int j = i+1; j <= n; j++){
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
答案 0 :(得分:6)
什么是N
?
如果N
为max(matrix.length, matrix[0].length)
,则算法为O(N ^ 2),正如您所说。
如果N
矩阵的总大小,则算法为O(N)。
确切地定义大{O}符号中的N
是非常重要的。在学习Big-O时,大多数讨论围绕着单维输入,人们认为你不必定义N
。在现实世界中,事物很脏,我们处理多维输入,你必须非常清楚N
是什么。
答案 1 :(得分:1)
不是O(n)。它是O(n ^ 2)。具体来说,它将执行0≤i≤n的n-i交换。因此它将执行0 + 1 + 2 + ... + n swaps = n(n + 1)/ 2个交换,即O(n ^ 2)。
答案 2 :(得分:0)
n = matrix.length - 1;
时间复杂度:O(N ^ 2)
空间复杂度:O(1)
说明:在第一个for循环中,我将从(0 --- N)开始。并在 第二个for循环,j将从(i + 1 --- N)开始。对于i = 0,您进行迭代 N-1个元素。对于i = 1,您迭代N-2个元素。同样,For i = N-1,你迭代最后一个元素
In total, T = (N-1) + (N-2) + (N-3) + ... + 2 + 1
T ~ N * (1+2+3+...+N)
T ~ O(N^2)