解法1:一层一层循环,坐标变换
import java.util.*; public class Solution { public int[][] rotateMatrix(int[][] mat, int n) { // write code here int tR=0; int tC=0; int dR=n-1; int dC=n-1; while(tR<dR){ for(int i=0;i<dC-tC;i++){ int tmp=mat[tR][tC+i]; mat[tR][tC+i]=mat[dR-i][tC]; mat[dR-i][tC]=mat[dR][dC-i]; mat[dR][dC-i]=mat[tR+i][dC]; mat[tR+i][dC]=tmp; } tR++; tC++; dR--; dC--; } return mat; } }
解法2:做两次翻转,先沿右上-左下的对角线翻转,再沿水平中线上下翻转
即:对于函数中的一个点,先以y=x为轴作对称,然后以x轴作对称,则相当于该点顺时针旋转90°。所以对于图像来说每个点顺时针旋转了,则图也旋转了。所以可以将图以对角线作对称,然后以中间的横线作对称。
import java.util.*; public class Rotate { public int[][] rotateMatrix(int[][] mat, int n) { // write code here // 对角线 for(int i=0; i<n;i++) { for(int j=i+1; j< n; j++) { int temp = mat[i][j]; mat[i][j] = mat[j][i]; mat[j][i] = temp; } } // 以竖轴翻转 for(int i=0;i<n;i++) { for(int j=0; j< n/2; j++) { int temp = mat[i][j]; mat[i][j] = mat[i][n-1-j]; mat[i][n-1-j] = temp; } } return mat; } }
解法3:找规律:mat[i][j]被旋转到了mat[j][n-i-1]的位置
import java.util.*; public class Rotate { public int[][] rotateMatrix(int[][] mat, int n) { // write code here int[][] temp=new int[n][n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { temp[j][n-1-i]=mat[i][j]; } } return temp; } }