[Leetcode][048] Rotate Image 略详细 (Java)
题目在这里 https://leetcode.com/problems/rotate-image/
【个人分析】
这个题目,我觉得就是考察基本功、考察细心的,算法方面没有太多东西,但是对于坐标的使用有较高要求。
放了两个版本的答案,第一个版本是自己写的,第二个是目前最佳答案的Java改写。
【代码注释】
Solution1: 思路比较直接。既然要求in-place,那就在修改之前,先保存原先在那个位置上的值,然后尾巴咬尾巴的去修改;大意可以参考下图
Solution2: 偏数学的方法,先把矩阵“上下对调”: 第一行和最后一行换,第二行和倒数第二行换。然后再镜像交换,第 i 行第 j 列的数和第 j 行第 i 列的数字交换。
1 public class Solution { 2 /** 3 * 1 2 3 4 13 9 5 1 13 9 5 1 4 * 5 6 7 8 outer loop 14 6 7 2 inner loop 14 10 6 2 5 * 9 10 11 12 ============> 15 10 11 3 ============> 15 11 7 3 6 * 13 14 15 16 16 12 8 4 16 12 8 4 7 * @param matrix 8 */ 9 public void rotate(int[][] matrix) { 10 int n = matrix.length; 11 if (n == 0) { 12 return; 13 } 14 int half = n / 2; 15 // for each loop 16 for (int i = 0; i < half; i++) { 17 int startIndex = i; 18 int endIndex = startIndex + (n - 2 * i) - 1; 19 // in one row, we leave the last number unchanged 20 // so it is j < endIndex, not j <= endIndex 21 for (int offset = 0; startIndex + offset < endIndex ; offset++) { 22 // number in the first row 23 int temp1 = matrix[startIndex][startIndex + offset]; 24 // number in the last column 25 int temp2 = matrix[startIndex + offset][endIndex]; 26 // number in the last row 27 int temp3 = matrix[endIndex][endIndex - offset]; 28 // number in the first column 29 int temp4 = matrix[endIndex - offset][startIndex]; 30 31 matrix[startIndex][startIndex + offset] = temp4; 32 matrix[startIndex + offset][endIndex] = temp1; 33 matrix[endIndex][endIndex - offset] = temp2; 34 matrix[endIndex - offset][startIndex] = temp3; 35 36 } 37 } 38 39 } 40 }
Solution2:
1 public class Solution { 2 /** 3 * First reverse top-bottom, then reverse symmetry 4 * 1 2 3 7 8 9 7 4 1 5 * 4 5 6 ==> 4 5 6 ==> 8 5 2 6 * 7 8 9 1 2 3 9 6 3 7 * @param matrix 8 */ 9 public void rotate(int[][] matrix) { 10 int n = matrix.length; 11 int middle = n / 2; 12 // reverse top-bottom, swap the ith row with (n-i)th row 13 for (int i = 0; i < middle; i++) { 14 for (int j = 0; j < n; j++) { 15 int temp = matrix[i][j]; 16 matrix[i][j] = matrix[n - 1 - i][j]; 17 matrix[n - 1 - i][j] = temp; 18 } 19 } 20 21 // swap symmetry 22 for (int i = 0; i < n; i++) { 23 for (int j = i + 1; j < n; j++) { 24 int temp = matrix[i][j]; 25 matrix[i][j] = matrix[j][i]; 26 matrix[j][i] = temp; 27 } 28 29 } 30 31 } 32 33 }