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

原地变形问题。

题目: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]);
        
    }
};



你可能感兴趣的:(方形矩阵顺时针旋转90度 Rotate Image)