[Leetcode][048] Rotate Image 略详细 (Java)

题目在这里 https://leetcode.com/problems/rotate-image/

【个人分析】

   这个题目,我觉得就是考察基本功、考察细心的,算法方面没有太多东西,但是对于坐标的使用有较高要求。

       放了两个版本的答案,第一个版本是自己写的,第二个是目前最佳答案的Java改写。

 【代码注释】

       Solution1: 思路比较直接。既然要求in-place,那就在修改之前,先保存原先在那个位置上的值,然后尾巴咬尾巴的去修改;大意可以参考下图

                                        [Leetcode][048] Rotate Image 略详细 (Java)

       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 }

 

你可能感兴趣的:(LeetCode)