Description
You are given an n x n 2D matrix representing an image.
Rotate the image by 90 degrees (clockwise).
Note
You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.
Example 1
Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
rotate the input matrix in-place such that it becomes:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
Example 2
Given input matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
rotate the input matrix in-place such that it becomes:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
Solution 1(C++)
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int m=matrix.size();
for(int i=0; i<m-1; i++){
for(int j=i; j<m-i-1; j++){
int temp = matrix[i][j];
matrix[i][j] = matrix[m-j-1][i];
matrix[m-j-1][i] = matrix[m-i-1][m-j-1];
matrix[m-i-1][m-j-1] = matrix[j][m-i-1];
matrix[j][m-i-1] = temp;
}
}
return;
}
};
Solution 2(C++)
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int start = 0, end = matrix.size()-1;
while(start<end){
for(int i=start; i<end; i++){
int offset = i-start;
int tmp = matrix[start][i];
matrix[start][i] = matrix[end-offset][start];
matrix[end-offset][start] = matrix[end][end-offset];
matrix[end][end-offset] = matrix[start+offset][end];
matrix[start+offset][end] = tmp;
}
start++; end--;
}
}
};
Solution 3(C++)
class Solution {
public:
void rotate(vector<vector<int>>& m) {
int n = m.size();
for(int i=0; i<n; i++)
for(int j=0; j<i; j++)
swap(m[i][j], m[j][i]);
for(int i=0; i<n; i++)
reverse(m[i].begin(), m[i].end());
}
};
Analysis of Algorithms
There are three main algorithms listed, you can take a look. My problem is mainly that the solution method 1 has deduced the formula, but the calculation is in the wrong direction, and the assignment order is reversed. In fact, the calculation is to rotate 90 degrees to the left.
program analysis
slightly.