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个2维矩阵来表示一个图。在原矩阵上旋转图形90°。
【分析】
思路1:
A[0][0] -> A[0][3]A[1][0] -> A[0][2]
A[0][1] -> A[1][3]A[2][0] -> A[0][1]
A[0][2] -> A[2][3]A[3][0] -> A[0][0]
A[0][3] -> A[3][3]
由此可得:对于n * n 的2维矩阵
A[i][j] -> A[j][n-1-i]
代码:
void rotate(vector<vector<int> > &matrix) {
int i,j;
int n = matrix.size();
vector<vector<int> >tempMatrix = matrix;
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
tempMatrix[j][n-1-i] = matrix[i][j];
}//for
}//for
for(i = 0;i < n;i++){
for(j = 0;j < n;j++){
matrix[i][j] = tempMatrix[i][j];
}//for
}//for
}
思路2:
纯模拟,从外到内一圈一圈的转,但这个方法太慢。
A[i][j] -> A[j][n-1-i] -> A[n-1-i][n-1-j] -> A[n-1-j][i] -> A[i][j]
代码:
void rotate(vector<vector<int> > &matrix) {
int i,j,temp;
int n=matrix.size();
for(i = 0;i < n/2;++i) {
for (j = i;j < n-1-i;++j) {
temp = matrix[j][n-i-1];
matrix[j][n-i-1] = matrix[i][j];
matrix[i][j] = matrix[n-j-1][i];
matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
matrix[n-i-1][n-j-1] = temp;
}//for
}//for
}
思路3:
代码:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
// 沿着副对角线反转
for(int i = 0; i < n; i++)
for(int j = 0; j < n -i ; j++)
swap(matrix[i][j],matrix[n-j-1][n-i-1]);
//沿着水平中轴上下交换
for(int i = 0; i < n/2; i++)
for(int j = 0; j < n ; j++)
swap(matrix[i][j],matrix[n-i-1][j]);
}
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
//沿着主对角线进行翻转
for(int i=0; i<n; i++)
for(int j=0; j<i; j++)
swap(matrix[i][j],matrix[j][i]);
//沿着中轴垂直线进行翻转
for(int i=0; i<n; i++)
reverse(matrix[i].begin(), matrix[i].end());
}