题意理解:
将给定二维矩阵顺时针选择90度;
题目分析:
1. 一层一层的旋转(解题代码中就是这个方法);
2. 技巧解法:将原始矩阵上下对折,然后再对角对折,等效于顺时针选择90度(没有想懂其中的数学原理);
解题代码:
class Solution {
private:
int read(vector<vector<int>> &m, int layer, int index){
int size=m.size();
int cap=size-2*layer;
if(index<cap){
return m[layer][layer+index];
}else if(index<2*cap){
return m[layer+index-cap][size-1-layer];//
}else if(index<3*cap){
return m[size-1-layer][size-1-layer-(index-2*cap)];
}else{
return m[size-1-(index-3*cap)-layer][layer];//
}
}
void set(vector<vector<int>> &m, int layer, int index, int value){
int size=m.size();
int cap=size-2*layer;
if(index<cap){
m[layer][layer+index]=value;
return;
}else if(index<2*cap){
m[layer+index-cap][size-1-layer]=value;//
return;
}else if(index<3*cap){
m[size-1-layer][size-1-layer-(index-2*cap)]=value;
return;
}else{
m[size-1-(index-3*cap)-layer][layer]=value;
return;
}
}
public:
void rotate(vector<vector<int>>& matrix) {
int size=matrix.size();
for(int i=0; i<size/2; i++){
int cap=size-2*i;
for(int j=0; j<cap-1; j++){
int top= read(matrix, i, j);
cout<<"top= "<<top<<endl;
int left=read(matrix, i, cap*3+j);
cout<<"left= "<<left<<endl;
set(matrix, i, j, left);//top
int bottom=read(matrix, i, cap*2+j);
cout<<"bottom= "<<bottom<<endl;
set(matrix, i, cap*3+j, bottom);//left
int right=read(matrix, i, cap+j);
cout<<"right= "<<right<<endl;
set(matrix, i, cap*2+j, right);//bottom
set(matrix, i, cap+j, top);//right
}
}
}
};