[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 }

 

posted @ 2015-05-01 02:04  StevenCooks  阅读(239)  评论(0编辑  收藏  举报