方形矩阵顺时针旋转90度 Rotate Image

142 篇文章 20 订阅
51 篇文章 0 订阅

原地变形问题。

题目:You are given an n x n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).要求,原地进行,空间复杂度为O(1)。

思路一:直观地去旋转。观察规律就知道把每个点A[i][j]放到A[j][n-1-j]去。为了节省空间,我必须连着串有序的挨个把原位置换到新位置。规律显示这样都是四个点一组,组内只要旋转的传递一圈即可,只需要加一个tmp就能完成循环传递。那么对于整个矩阵,有多少个这样的一组四个点?

    观察发现从0,0点开始,是最外圈,最外圈的组有n-1个。逐步往里,每往里一圈,组的个数就减少2个(对称的),内圈的组越来越少。直到最里面的一圈只有一组4个点,或者只有1个点。

    一个组四个点循环传递即可,即要把A[n-1-j][i]放到A[i][j]中去。

该方法的时间复杂度为O(N*N)。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        if (n <= 0)
            return;
            
        int i, j, k, tmp, temp;
        
        for(i=0; i<=(n-1)/2; i++) //i从0到(n-1)/2
            for(j=i; j<=n-2-i; j++) //j从i到n-2-i
            {
                tmp = matrix[i][j];
                for(k=0;k<3;k++)
                {
                    matrix[i][j] = matrix[n-1-j][i];
                    temp = i;
                    i = n-1-j;
                    j = temp;
                }
                matrix[i][j] = tmp;
                temp = i; //第四次能得把i,j更新回开始的值
                i = n-1-j;
                j = temp;
            }
    }
};

思路二:有技巧地翻转。首先沿着中间水平线做对称翻转,然后沿着主对角线做对称翻转。(也可以先沿着副对角线对称翻转,再沿着水平中线对称翻转)。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        
        // 沿着水平中线翻转
        for(int i=0;i<n/2;i++)
            for(int j=0;j<n;j++)
                swap(matrix[i][j], matrix[n-1-i][j]);
        // 沿着主对角线翻转
        for(int i=0;i<n-1;i++)
            for(int j=i+1;j<n;j++)
                swap(matrix[i][j], matrix[j][i]);
        
    }
};



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值