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?
s思路:
1. 初看这个题,比较nasty,很烦。矩阵旋转,简单粗暴的做法:每个元素根据坐标找到旋转后的位置,每个坐标都要计算。而且如果要求in-place,这个粗暴的方法就显得更low,没有一点技术含量!
2. 让人感到无聊的题是因为自以为的没技术含量的解答过程无聊,题目本身并不无聊!仔细思考这道题,解答过程如果使用一点矩阵操作的知识就能容易解决!
|1 2 3|
|4 5 6|旋转后=
|7 8 9|
|7 4 1|
|8 5 2|
|9 6 3|
-------------------------------分割线--------------
|1 2 3|
|4 5 6|的关于左斜45度对角线的对称矩阵=
|7 8 9|
|9 6 3|
|8 5 2|
|7 4 1|,在这个对称矩阵基础上,再每个列向量reverse,即等于要求的矩阵旋转!
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
//对称矩阵的递推公式:matrix[i][j]=matrix[n-1-j][n-1-i];
int n=matrix.size();
for(int i=0;i<n;i++){
for(int j=0;i+j<n;j++){
int tmp=matrix[i][j];
matrix[i][j]=matrix[n-1-j][n-1-i];
matrix[n-1-j][n-1-i]=tmp;
}
}
//reverse all the column vector
for(int i=0;i<n;i++){
int upper=0,lower=n-1;
while(upper<lower){
swap(matrix[upper][i],matrix[lower][i]);
upper++;lower--;
}
}
}
};
方法2:
1. 方法一样,但是不同的矩阵操作,把image rotation分解成两步:1. 对称矩阵:关于对角线交换matrix[i][j]=matrix[j][i];2. 交换列。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();
if(n<=1) return;
int tmp;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
tmp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=tmp;
}
}
for(int i=0;i<n/2;i++){
for(int j=0;j<n;j++){
tmp=matrix[j][i];
matrix[j][i]=matrix[j][n-1-i];
matrix[j][n-1-i]=tmp;
}
}
}
};