#leetcode#Rotate Image

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

Rotate the image by 90 degrees (clockwise).

Follow up:

Could you do this in-place?


----


这里需要画图找一下rotate 90 degree的坐标变换

按照顺时针方向, 正方形的上, 右, 下, 左,取对应的1,2,3,4四个点

1:  (row, col)

2: (col, len - row - 1)

3: (len - row - 1, len - col - 1)

4:   (len - col - 1, row)



复制顺序也需要注意, :

1 --> tmp

4 --> 1

3 --> 4

2 --> 3

tmp --> 2



另外一个地方需要注意就是内层循环的起始点, 其实是把正方形的两个对角线连接起来, 形成的四个三角形区域在rotate, 以 6 * 6 matrix为例, 第二层rotate的时候for(i = layer; i < len - layer - 1; i++){}  这里layer = 1

也就是[1][1],[1][2], [1][3]这三个点, 并不包括[1][4], 因为[1][4]属于右边三角形区域需要rotate的点的第一个


public class Solution {
    public void rotate(int[][] matrix) {
        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return;
        }
        int n = matrix.length;
        int layer = n / 2;
        for(int i = 0; i < layer; i++){
            // for(int j = layer; j < n - layer; j++){
            for(int j = i; j < n - i - 1; j++){
                // 赋值顺序错了啊。。。。!!!!!!!!!!
                // matrix[i][j] = matrix[j][n - i - 1];
                // matrix[j][n - i - 1] = matrix[n -  i - 1][n - j - 1];
                // matrix[n -  i - 1][n - j - 1] = matrix[n - j - 1][i];
                // matrix[n - j - 1][i] = tmp;
                
                // 1 --> tmp; 4 --> 1; 3 --> 4; 2 --> 3; tmp --> 2
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] =  matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = tmp;
            }
        }
    }
}



复杂度分析: 

每个点都rotate了一次, 时间复杂度是 点的个数 O(n^2), 空间复杂度只用到了一个 int tmp, 所以是O(1)

你可能感兴趣的:(LeetCode)