lintcode---旋转图形

题目描述:|
给定一个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++;
        }
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值