lintcode---旋转图形

来源:互联网 发布:男士去油洗面奶 知乎 编辑:程序博客网 时间:2024/06/01 07:26

题目描述:|
给定一个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++;        }    }};
原创粉丝点击