wordpress获取站点链接/面点培训学校哪里有
给定一个 n×n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在**原地**旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[[1,2,3],[4,5,6],[7,8,9]
],
原地旋转输入矩阵,使其变为:
[[7,4,1],[8,5,2],[9,6,3]
]
示例 2:
给定 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]
]
C++
通过观察我们可以发现,n×n
的二维矩阵在顺时针旋转90°之后,只是每一个环之内的元素位置进行交换,例如4×4
的矩阵只有两个环。
我们设M
矩阵为4×4
的二维矩阵,首先我们对最外圈的12
个元素的位置进行顺时针旋转:
令Mi,jM_{i,j}Mi,j表示矩阵M
中下标为(i,j)
的元素的值,那么观察得出M0,0M_{0,0}M0,0旋转之后到了M0,3M_{0,3}M0,3的位置,而M0,3M_{0,3}M0,3旋转后位置为(3,3)
,以此类推:
M3,0→M0,0M_{3,0} → M_{0,0}M3,0→M0,0
M3,3→M3,0M_{3,3} → M_{3,0}M3,3→M3,0
M0,3→M3,3M_{0,3} → M_{3,3}M0,3→M3,3
M0,0→M0,3M_{0,0} → M_{0,3}M0,0→M0,3
这样就完成了外环里4
个相关位置的推动变换。同理,M0,1M_{0,1}M0,1、M0,2M_{0,2}M0,2也可以旋转到最后的相应位置。由于处在边缘的M0,0M_{0,0}M0,0和M3,0M_{3,0}M3,0这类元素旋转之后位置会进行自动改变,所以最外环只需要考虑从(0,0),(0,1),(0,2)
顺时针推动相应位置的变化。内环由于只有四个元素,所以只需要在(1,1)
位置开始推动旋转即可。
class Solution {
public:void rotate(vector<vector<int>>& matrix) {int row = matrix.size(); //行数、列数int n = 0;//由于是正方形,所以只有n/2个环,如果n为奇数,则最内环不用旋转while(n<row/2){// 每个环的起始推动点为(n,n)for(int j=n;j<row-1-n;j++){// 先记录每次循环的4个点的起点的值int temp = matrix[n][j];//位置推演步骤matrix[n][j] = matrix[row-1-j][n];matrix[row-1-j][n] = matrix[row-1-n][row-1-j];matrix[row-1-n][row-1-j] = matrix[j][row-1-n];//起点的值赋值为顺时针旋转的下个位置matrix[j][row-1-n] = temp;}n++;} }
};