JavaScript 将矩阵顺时针旋转180度
一个方阵是一个有相等行数和列数的二维数组,我们要将矩阵逆时针旋转180度。逆时针旋转矩阵意味着先将所有的行转换为列,第一行将成为第一列,然后再次将行转换为列,第一行将成为第一列,以此类推。
让我们看一个示例−
Input 1:
N = 3
Matrix = [ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Output 1:
Matrix = [ [9, 8 ,7],
[6, 5, 4],
[3, 2, 1] ]
Input 2:
N = 5
Matrix = [ [1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25] ]
Output 2:
Matrix = [ [25, 24, 23, 22, 21],
[20, 19, 18, 17, 16],
[15, 14, 13, 12, 11],
[10, 9, 8, 7, 6],
[5, 4, 3, 2, 1] ]
原生方法
让我们看一个示例
N = 3;
Matrix = [ [00, 01, 02],
[10, 11, 12],
[20, 21, 22] ]
我们将矩阵逆时针旋转90度(第一次)
Matrix become = [ [02, 12, 22],
[01, 11, 21],
[00, 10, 20] ]
再次将矩阵旋转90度(第二次旋转后成为90+90=180度)
Matrix become = [ [22, 21, 20],
[12, 11, 10],
[02, 01, 00] ]
所以基本上,如果我们从n-1到0(包括)遍历矩阵的行,在嵌套的for循环中,我们遍历从n-1到0(包括)的列,就能得到旋转后的矩阵。为了更好地理解,让我们看一下下面这种方法的代码。
示例
//function for rotate the matrix
function rotateMatrix( matrix){
// getting size of the matrix
var n = matrix.length;
// start getting elements for the last row
for(var i = n-1; i >= 0; i--){
var temp = "";
// start getting elements for the last column
for(var j = n-1; j >= 0; j--){
temp += matrix[i][j] + " ";
}
console.log(temp);
}
}
// defining the matrix
var n = 4;
var mat = [ [ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12],
[ 13, 14, 15, 16]];
console.log("Matrix after rotation is: ")
//calling the function
rotateMatrix(mat);
时间复杂度和空间复杂度
上述代码的时间复杂度为O(N*N)
,其中N是给定矩阵的行数或列数,因为我们只遍历了一次。
上述代码的空间复杂度为O(1),因为我们没有使用额外的空间。
将结果存储在给定矩阵中
在这种方法中,我们将结果存储在我们拥有的矩阵中,不使用任何额外的空间。我们可以看到第一行和最后一行以相反的顺序进行交换。同样,第二行和倒数第二行以相反的方式交换。根据这个观察,我们可以编写以下代码:
示例
//function for rotate the matrix
function rotateMatrix( matrix){
// getting size of the matrix
var n = matrix.length;
// start getting elements for the last row
for(var i = 0; i < n/2; i++){
matrix[i].reverse();
matrix[n-1-i].reverse();
for(var j = 0; j<n;j++) {
[matrix[i][j], matrix[n-1-i][j]] = [matrix[n-1-i][j], matrix[i][j]]
}
}
console.log(matrix)
}
// defining the matrix
var n = 4;
var mat = [ [ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12],
[ 13, 14, 15, 16]];
console.log("Input Matrix:
", mat)
console.log("Matrix after rotation is: ")
//calling the function
rotateMatrix(mat);
时间和空间复杂度
上述代码的时间复杂度为O(N*N)
,其中N是给定矩阵的行数或列数,因为我们只遍历了一次。
上述代码的空间复杂度为O(1),因为没有使用额外的空间。
结论
在本教程中,我们看到了两种不同的方法来将给定的矩阵旋转180度。通过观察,我们得出结论,翻转的第一行的元素将与翻转的最后一行的元素互换位置。类似地,对于第二行和倒数第二行等等。我们实现了时间复杂度为O(N*N)
,并且没有使用额外空间的代码。