问题描述
给定一个矩阵,要求在不额外新增矩阵空间的情况下在原矩阵上将矩阵顺时针旋转 90 度。题目链接:**点我**
样例输入输出
输入:
[
[1,2,3],
[4,5,6],
[7,8,9]
]
输出:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
输入:
[
[ 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]
]
问题解法
此题要求在原有矩阵上进行变换,即不能新 new 一个矩阵然后将数字进行填充。因此,可以先将矩阵进行转置,然后再将矩阵向左翻转(以列为单位,首尾互换)。例如,对于以下的矩阵
1 2 3 4 5
| [ [1,2,3], [4,5,6], [7,8,9] ]
|
求转置后矩阵如下
1 2 3 4 5
| [ [1,4,7], [2,5,8], [3,6,9] ]
|
再向左翻转后,得到的矩阵如下,此时的矩阵就是最开始的矩阵顺时针旋转 90 度的结果。
1 2 3 4 5
| [ [7,4,1], [8,5,2], [9,6,3] ]
|
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public void rotate(int[][] matrix) { if (matrix == null || matrix[0] == null || matrix.length == 0 || matrix.length != matrix[0].length) { return; } int n = matrix.length; for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } int len = n / 2; for (int j = 0; j < len; j++) { for (int i = 0; i < n; i++) { int temp = matrix[i][j]; matrix[i][j] = matrix[i][n - j - 1]; matrix[i][n - j - 1] = temp; } } } }
|