题目:旋转图像

以矩阵的四个对角点为例(左上A,右上B,右下C,左下D),从A开始,顺序是D->A, A->B, B->C, C->D

不过这会出现一个状况,就是当 D 执行旋转之后,A 的值就已经被覆盖了,所以需要额外使用一个临时变量用于存储 A 的值,在最后的时候再覆盖到原来 B 的位置

接下来就是需要得到元素的旋转公式

如图,可以总结出元素的旋转公式是:

matrix [ i ][ j ] 原索引位置→matrix [ j ][ n −1−i ]→旋转后索引位置

之后就是按照一开始的思路进行赋值就行

唯一要注意的是循环的边界条件:0 <= i < n / 2 , 0 <= j < (n + 1) / 2

至于为什么是这样的范围:因为对于矩阵中的单个元素来说,对他进行一次旋转就相当于挪动了四个元素的位置,所以我们只需要遍历矩阵的四分之一就行了,这也就是 i,j 右边界不为n的原因

而 j 的右边界之所以是 (n + 1) / 2,是因为要考虑奇数矩阵与偶数矩阵(前者有中心元素,后者没有)

因为这里的 “ /2 ”是整数除法,所以可以确保阶数为奇数时,中心元素不进行处理

 矩阵顺时针旋转 90 度时,元素位置从 [i][j] 映射到 [j][n-1-i]

 1
 2void rotate(vector<vector<int>>& matrix)
 3
 4{
 5
 6    int n = matrix.size();
 7
 8    for(int i = 0; i < n / 2; i++)
 9
10    {
11
12        for(int j = 0; j < (n + 1) / 2; j++)
13
14        {
15
16            int temp = matrix[i][j];
17
18            matrix[i][j] = matrix[n - 1 - j][i];
19
20            matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
21
22            matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
23
24            matrix[j][n - 1 - i] = temp;
25
26        }
27
28    }
29
30}