原题:
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] ]
题意是把一个矩阵顺时针旋转90度,一开始我想一次到位,但是感觉不好定下标,所以就打算分解步骤。我写了一个函数用来把某层旋转一步,就是这一层(比如最外面一层)都顺时针旋转一格,这样就可以在主函数里确定每层旋转几次,结果:
Success
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Rotate Image.
Memory Usage: 8.9 MB, less than 100.00% of C++ online submissions for Rotate Image.
代码:
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int size=matrix.size();
int index=size/2-1;
for(int i=0;i<=index;i++){
for(int j=0;j<size-2*i-1;j++){rotate_once(matrix,i);}
}
}
void rotate_once(vector<vector<int>>&matrix,int index){
int max=matrix.size()-index-1;
if(max<=index){return;}
int temp=matrix[index][index];
for(int i=index;i<max;i++){
matrix[i][index]=matrix[i+1][index];
}
for(int i=index;i<max;i++){
matrix[max][i]=matrix[max][i+1];
}
for(int i=max;i>index;i--){
matrix[i][max]=matrix[i-1][max];
}
for(int i=max;i>index+1;i--){
matrix[index][i]=matrix[index][i-1];
}
matrix[index][index+1]=temp;
}
};