旋转图像

给定一个 × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。示例如下:

给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

对于matrix中的元素matrix[i][j],将其旋转90度后,对应的位置为matrix[j][M-i],M为n-1

如matrix[0][0]的值为5, 旋转后matrix[0][3-0]的值为5

   matrix[1][0]的值为2,旋转后matrix[0][3-1]的值为2

实现方法:

先将矩阵最外的一圈旋转,接着逐渐将内部的圈旋转。

如矩阵

5

1

9

11

2

4

8

10

13

3

6

7

15

14

12

16

首先旋转最外面的一圈,接着旋转里面的一圈。

最外面一圈只需将5、1、9旋转完成即可,最里面的一圈只需要旋转4即可

5->11   11->16  16->15  15->5,同样的方法旋转1、9

对于n x n的矩阵

第一圈需要旋转n-1个元素,matrix[0][0]  -    matrix[0][n-2]

第二圈需要旋转n-3个元素,matrix[1][1]  -   matrix[1][n-3]

第三圈n-5

。。。

如下图所示:

 代码如下:

    public static void rotate(int[][] matrix) {

        int M = matrix.length - 1;
        // 每行需要旋转的元素个数
        int len = M;
        int temp;
        int i=0, j=0;
        while (len > 0) {

            for (j=i; j<i+len; j++) {
                // 旋转四个元素
                temp = matrix[j][M-i];
                matrix[j][M-i] = matrix[i][j];
                matrix[i][j] = matrix[M-j][i];
                matrix[M-j][i] = matrix[M-i][M-j];
                matrix[M-i][M-j] = temp;
            }
            i++;
            len -= 2;
        }
    }

猜你喜欢

转载自www.cnblogs.com/deltadeblog/p/8975878.html