LeetCode : Rotate Image #48

LeetCode 练习 & 实现技巧学习

最近加入了一个邪恶的刷题组织,今天我要完成一道题的简单解析与算法实现分析,抽到了 Midum 的 Rotate Array。

Question

You are given an n x n 2 D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up: Could you do this in-place?

Analysis

这道题是一个多维数组变换的问题,题目要求一个 NxN 的二维的 Matrix,把这个 Matrix 顺时针翻转。

有两种实现方法,先讲最好理解的方法一。

解法一

先转置(transpose),然后再左右对称地翻转(flip symmetrically)。示意图如下:

1
2
3
1 2 3     7 8 9     7 4 1
4 5 6  => 4 5 6  => 8 5 2
7 8 9     1 2 3     9 6 3

解法二

第二种方法就是直接按照题意翻转这个 matrix,只需要找到翻转的点与点之间的关系。

//解析正在分析中

Solution

解法一(Java)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Solution {
    public void rotate(int[][] matrix) {
        int N = matrix.length;
        if(N>1&&matrix[0].length==N){
            for(int i = 0; i<matrix.length; i++){
                for(int j = i; j<matrix[0].length; j++){
                    int temp = 0;
                    temp = matrix[i][j];
                    matrix[i][j] = matrix[j][i];
                    matrix[j][i] = temp;
                }
            }
            for(int i =0 ; i<matrix.length; i++){
                for(int j = 0; j<matrix.length/2; j++){
                    int temp = 0;
                    temp = matrix[i][j];
                    matrix[i][j] = matrix[i][matrix.length-1-j];
                    matrix[i][matrix.length-1-j] = temp;
                }
            }
        }
    }
}

同一解法的优化版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public void rotate(int[][] matrix) {
    int n = matrix.length;
    // Reverse
    for (int i = 0; i < n / 2; ++i) {
        int j = n - 1 - i;
        int[] cache = matrix[i];
        matrix[i] = matrix[j];
        matrix[j] = cache;
    }
    // Transpose
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            int cache = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = cache;
        }
    }
}

解法二

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public void rotate(int[][] matrix) {
    int n = matrix.length;
    for (int i = 0; i < n / 2; ++i) {
        int j = n - 1 - i;
        for (int p = i; p < j; ++p) {
            int q = n - 1 - p;
            int cache = matrix[i][p];
            matrix[i][p] = matrix[q][i];
            matrix[q][i] = matrix[j][q];
            matrix[j][q] = matrix[p][j];
            matrix[p][j] = cache;
        }
    }
}

Reference

Rotate Image #48 - LeetCode

LeetCode : Rotate Image #48 - GitHub

使用 Hugo 构建
主题 StackJimmy 设计