题目描述:|
给定一个N×N的二维矩阵表示图像,90度顺时针旋转图像。
样例:给出一个矩形[[1,2],[3,4]],90度顺时针旋转后,返回[[3,1],[4,2]]
思路分析:
由于是一个n*n的矩阵,所以不用考虑m*n那样的情况,我们通过一个4*4的矩阵演示,发现所谓的旋转图像就是把矩阵每一圈的数值向前平移n-1个的单位,这个有点像前面的一维数组平移问题,只不过这里将一维数组变成了矩阵周围的一圈(正方形),所以我们只需要对每一圈进行处理,然后递归调用这个函数就可以实现所有的数字平移n-1,这样就使得整个矩阵旋转了。
代码详解:
class Solution {
public:
/*
* @param matrix: a lists of integers
* @return:
*/
void rotate(vector<vector<int>> &matrix) {
// write your code here
int length=matrix.size();
int loop=length/2;//递归调用的次数
for(int i=0;i<loop;i++)
{
rotateloop(matrix,i);
}
}
void rotateloop(vector<vector<int>> &matrix,int a)//对每一个圈的处理
{
int length=matrix.size();
int n=length-2*a;
int *temp=new int[n-1];//保存边上的所有数据
int flag=0;//record temp position
for(int i=length-a-1;i>a;i--)//首先最后一条边的数字保存起来
{
temp[flag]=matrix[i][a];
flag++;
}
flag=0;
for(int i=a;i<length-a-1;i++)//将最后一条边的数字赋值给第一条边,并把第一条边的值保存起来
{
int temp_int=matrix[a][i];
matrix[a][i]=temp[flag];
temp[flag]=temp_int;
flag++;
}
flag=0;
for(int i=a;i<length-a-1;i++)//将第一条边的数字赋值给第二条边,并把第二条边的值保存起来
{
int temp_int=matrix[i][length-a-1];
matrix[i][length-a-1]=temp[flag];
temp[flag]=temp_int;
flag++;
}
flag=0;
for(int i=length-a-1;i>a;i--)//将第二条边的数字赋值给第三条边,并把第三条边的值保存起来
{
int temp_int=matrix[length-a-1][i];
matrix[length-a-1][i]=temp[flag];
temp[flag]=temp_int;
flag++;
}
flag=0;
for(int i=length-a-1;i>a;i--)//将第三条边的数字赋值给第四条边
{
int temp_int=matrix[i][a];
matrix[i][a]=temp[flag];
temp[flag]=temp_int;
flag++;
}
}
};