题目:
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Follow up:
Could you do this in-place?
不使用额外的存储空间,完成N*N的图片的90度旋转(顺时针)
Answer 1: 中心旋转法
思路:根据题意,我们知道图片旋转是根据中心进行旋转的,于是我们将图片根据两条对角线划分为四个区域: A, A‘, A",A"‘.然后依次替换四个位置的值,维护左上角的值。我们要做的就是将上边替换到右边,右边替换到下边,下边替换到左边。实际上完成的就是A ->A‘->A"->A"‘->A
,实现四个区域的替换。所以外层循环从0~matrix.size()/2, 内层循环根据对角线从i ~ matrix.size() - i -1.我们唯一要注意的就是替换左边的确定,具体可以画图得到。可以参考如下的图加以理解。根据旋转中不变的长度来判断。
AC Code:
class Solution { public: void rotate(vector<vector<int> > &matrix) { int n = matrix.size(); for(int i = 0; i < n/2; i++) { for(int j = i; j < n - 1 - i; j++) { int tmp = matrix[i][j]; matrix[i][j] = matrix[n-1-j][i]; matrix[n-1-j][i] = matrix[n-1-i][n-1-j]; matrix[n-1-i][n-1-j] = matrix[j][n-1-i]; matrix[j][n-1-i] = tmp; } } return; } };
Answer 2:
转置法 (程序更简洁)
思路1:先得到原矩阵的转置矩阵,之后从转置矩阵到旋转矩阵再reverse每行的元素即可。
思路2:先上下折叠原矩阵,再计算折叠矩阵的转置矩阵,即所求矩阵。
有图好理解,矩阵如下图:
Attention:
求转置矩阵时,将下三角矩阵和上三角矩阵元素交换。注意循环的里外层范围确定。
for(int i=0,n=matrix.size();i<n;++i){ for(int j=i+1;j<n;++j)
AC Code1:
class Solution { public: void rotate(vector<vector<int> > &matrix) { int n = matrix.size(); for(int i = 0; i < n; i++) { for(int j = i+1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } reverse(matrix[i].begin(), matrix[i].end()); } return; } };
AC Code2:
class Solution { public: void rotate(vector<vector<int> > &matrix) { int n = matrix.size(); reverse(matrix.begin(), matrix.end()); for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { swap(matrix[i][j], matrix[j][i]); } } return; } };
时间: 2024-10-09 04:38:34