本题是要顺时针旋转,先转置,后左右对称;
若要逆时针旋转,先转置,再上下对称。
本思路java代码示例:
/*
*@v7fgg
*执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗 :39.8 MB, 在所有 Java 提交中击败了100.00%的用户
*2020年6月11日 21:57
*/
class Solution {
public void rotate(int[][] matrix) {
//先转置,再左右
int N=matrix.length;
//转置
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
int linshi=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=linshi;
}
}
//左右
for(int i=0;i<N;i++){
for(int j=0;j<N/2;j++){
int linshi=matrix[i][j];
matrix[i][j]=matrix[i][N-1-j];
matrix[i][N-1-j]=linshi;
}
}
}
}
这也是常规模拟的办法。把矩阵分为四块,左上角那个块儿里面的每一个元素,都对应着另外三个块儿里面的三个元素,这四个元素互相旋转。
需要注意:当行数为偶数的时候,可以规规矩矩分成四个小正方形;而当行数为奇数,那么就是四个长方形,长宽差1,并且在长度一半上下,四个长方形的元素按照上边的方法旋转,最中间的元素不必动位置。
本思路java代码示例:
/*
@v7fgg
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:40.1 MB, 在所有 Java 提交中击败了7.69%的用户
2020年7月7日 15:04
*/
class Solution {
public void rotate(int[][] matrix) {
if(matrix.length%2==0){
for(int i=0;i<matrix.length/2;i++){
for(int j=0;j<matrix.length/2;j++){
int linshi=matrix[i][j];
matrix[i][j]=matrix[matrix.length-1-j][i];
matrix[matrix.length-1-j][i]=matrix[matrix.length-1-i][matrix.length-1-j];
matrix[matrix.length-1-i][matrix.length-1-j]=matrix[j][matrix.length-1-i];
matrix[j][matrix.length-1-i]=linshi;
}
}
}
else{
for(int i=0;i<matrix.length/2;i++){
for(int j=0;j<=matrix.length/2;j++){
int linshi=matrix[i][j];
matrix[i][j]=matrix[matrix.length-1-j][i];
matrix[matrix.length-1-j][i]=matrix[matrix.length-1-i][matrix.length-1-j];
matrix[matrix.length-1-i][matrix.length-1-j]=matrix[j][matrix.length-1-i];
matrix[j][matrix.length-1-i]=linshi;
}
}
}
}
}