在做矩阵旋转90°时,做的是顺时针旋转90°,但是想到了逆时针怎么做呢?这其中牵扯到对角线问题,主对角线好想,但是副对角线,自己还是想了一会儿?
自己原来做的顺时针打印矩阵,用的循环遍历,其实还有一种旋转矩阵的做法。
矩阵顺时针旋转90°
1 2 3
4 5 6
7 8 9
---第一步:上下颠倒矩阵
7 8 9
4 5 6
1 2 3
---第二步:关于主对角线交换元素
7 4 1
8 5 2
9 6 3
代码如下:
class Solution {
public void rotate(int[][] matrix) {//交换主对角线两边元素
reverse(matrix);
for(int i = 0;i<matrix.length;i++){
for(int j = i+1;j<matrix.length;j++){
int temp = matrix[i][j];
matrix[i][j] =matrix[j][i];
matrix[j][i]=temp;
}
}
}
public void reverse(int[][] matrix){//颠倒矩阵
int n = matrix.length-1;
for(int i = 0;i<matrix.length/2;i++){
for(int j=0;j<matrix[i].length;j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[n-i][j];
matrix[n-i][j]=temp;
}
}
}
}
矩阵逆时针旋转90°
逆时针与顺时针做法步骤一样,都是先上下颠倒矩阵,在对换对角线两边元素,不过
这次是副对角线两边元素。
1 2 3
4 5 6
7 8 9
----第一步:矩阵上下颠倒
7 8 9
4 5 6
1 2 3
-----第二步:交换副对角线两边元素
3 6 9
2 5 8
1 4 7
这关键是找到副对角线两边元素之间的关系:
a[i][j] ---------------a[n-j][n-i]
代码如下:
class Solution {
public void rotate(int[][] matrix) {//交换主对角线两边元素
reverse(matrix);
for(int i = 0;i<array.length;i++) {
for(int j = 0;j<array.length-i-1;j++) {
int temp = array[i][j];
array[i][j] = array[n-j][n-i];
array[n-j][n-i] = temp;
}
}
}
public void reverse(int[][] matrix){//颠倒矩阵
int n = matrix.length-1;
for(int i = 0;i<matrix.length/2;i++){
for(int j=0;j<matrix[i].length;j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[n-i][j];
matrix[n-i][j]=temp;
}
}
}
}
顺时针打印矩阵:
1 2 3
4 5 6
7 8 9
---打印第一行
---逆时针旋转90°
6 9
5 8
4 7
---打印第一行
---逆时针旋转90°
8 7
5 4
---打印第一行
---逆时针旋转90°
4
5
---打印第一行
---逆时针旋转90°
5
打印第一行
逆时针打印矩阵:
每次顺时针旋转矩阵就行了