题目:旋转图像
以矩阵的四个对角点为例(左上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]](/images/leetcode-matrix-medium/leetcode-matrix-medium-01.png)
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}