题目大意:顺时针一次旋转矩阵。例子如下:
法一:新开辟一个数组空间,将每一行的数值赋值给每一列。代码如下(耗时3ms):
1 public void rotate(int[][] matrix) { 2 int[][] res = new int[matrix.length][matrix.length]; 3 int k = matrix.length - 1; 4 //逐行换到逐列 5 for(int i = 0; i < matrix.length; i++) { 6 for(int j = 0; j < matrix.length; j++) { 7 res[j][k] = matrix[i][j]; 8 } 9 k--; 10 } 11 //将数值复制回去 12 for(int i = 0; i < matrix.length; i++) { 13 for(int j = 0; j < matrix.length; j++) { 14 matrix[i][j] = res[i][j]; 15 } 16 } 17 }
法二(借鉴):每一个数换到一个位置,那个位置上的数就会换到其他位置,最后一个数会换到刚开始的那个位置,比如1->3->9->7->1。
所以根据这个换位规律,得到如下代码。代码如下(耗时2ms):
1 public void rotate(int[][] matrix) { 2 int n = matrix.length; 3 //逐行 4 for(int i = 0; i < n / 2; i++) { 5 //每行中需要旋转的数值 6 for(int j = i; j < n - i - 1; j++) { 7 int tmp = matrix[i][j]; 8 matrix[i][j] = matrix[n - j - 1][i]; 9 matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; 10 matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; 11 matrix[j][n - i - 1] = tmp; 12 } 13 } 14 }
法三(借鉴):先根据对角线翻转 一次,然后在根据x轴中线翻转一次,可以得到最终结果。
根据这个规律,得到如下代码。代码如下(耗时3ms):
1 public void rotate(int[][] matrix) { 2 int n = matrix.length; 3 //沿对角线翻转 4 for(int i = 0; i < n - 1; i++) { 5 for(int j = 0; j < n - i; j++) { 6 int tmp = matrix[i][j]; 7 matrix[i][j] = matrix[n - j - 1][n - i - 1]; 8 matrix[n - j - 1][n - i - 1] = tmp; 9 } 10 } 11 //沿x轴中线翻转 12 for(int i = 0; i < n / 2; i++) { 13 for(int j = 0; j < n; j++) { 14 int tmp = matrix[i][j]; 15 matrix[i][j] = matrix[n - i - 1][j]; 16 matrix[n - i - 1][j] = tmp; 17 } 18 } 19 }
法四(借鉴):先得到其转置矩阵(实际就是根据对角线翻转),然后在根据y轴中线翻转一次,可以得到最终结果。
根据这个规律,得到如下代码。代码如下(耗时3ms):
1 public void rotate(int[][] matrix) { 2 int n = matrix.length; 3 //得到转置矩阵 4 for(int i = 0; i < n; i++) { 5 for(int j = i + 1; j < n; j++) { 6 int tmp = matrix[i][j]; 7 matrix[i][j] = matrix[j][i]; 8 matrix[j][i] = tmp; 9 } 10 } 11 //沿y轴中线翻转 12 for(int i = 0; i < n; i++) { 13 for(int j = 0; j < n / 2; j++) { 14 int tmp = matrix[i][j]; 15 matrix[i][j] = matrix[i][n - j - 1]; 16 matrix[i][n - j - 1] = tmp; 17 } 18 } 19 }