我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/rotate-image/description/
题目描述:
知识点:数组
思路:模拟手工“旋转”的过程
如果题目没有“原地”旋转这一要求,是很简单的一道题,我们只需要新建一个一模一样大小的二维数组,按照规律填入数据即可。
既然题目有了“原地”旋转这一要求,我们应该怎么做呢?
其实只要我们在草稿纸上计算清楚旋转的规律就很简单。对于一个矩形,它有4条边,对于它的旋转,其实是4个位置之间的交换。那么,是哪4个位置之间的交换呢?以示例2所给矩阵中(0, 0)位置为例,如果旋转,有如下规律:
(3, 0) -> (0, 0)
(3, 3) -> (3, 0)
(0, 3) -> (0, 0)
(0, 0) -> (0, 3)
同理,对于(0, 1)位置,有如下旋转规律:
(2, 0) -> (0, 1)
(3, 2) -> (2, 0)
(1, 3) -> (3, 2)
(0, 1) -> (1, 3)
同理,对于(0, 2)位置,有如下旋转规律:
(1, 0) -> (0, 2)
(3, 1) -> (1, 0)
(2, 3) -> (3, 1)
(0, 2) -> (2, 3)
对于(0, 3)位置,我们已经在处理(0, 0)位置的旋转中涉及了该值,我们不该再继续旋转。
按照这个规律,我们从最外层一直旋转到最内层,直至不能旋转为止。其旋转层数与矩阵阶数的规律如下:
矩阵阶数 | 旋转层数 |
0 | 0 |
1 | 0 |
2 | 1 |
3 | 1 |
4 | 2 |
因此,对于n阶矩阵,我们需要旋转的层数是n / 2。
时间复杂度上,对于n阶矩阵我们需要旋转n / 2层,而对于第k层(k从0开始计数),我们需要旋转n - 1 - 2k个位置,因此其时间复杂度是O(n ^ 2)级别的。而对于空间复杂度,我们是“原地”旋转,空间复杂度是O(1)级别的。
JAVA代码:
public class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for (int k = 0; k <= n / 2; k++) {
for (int i = k; i < n - 1 - k; i++) {
int temp = matrix[k][i];
matrix[k][i] = matrix[n - 1 - i][k];
matrix[n - 1 - i][k] = matrix[n - 1 - k][n - 1 - i];
matrix[n - 1 - k][n - 1 - i] = matrix[i][n - 1 - k];
matrix[i][n - 1 - k] = temp;
}
}
}
}
LeetCode解题报告: