给定一个 n × 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; } }