[C++]LeetCode: 68 Rotate Image

题目:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

不使用额外的存储空间,完成N*N的图片的90度旋转(顺时针)

Answer 1: 中心旋转法

思路:根据题意,我们知道图片旋转是根据中心进行旋转的,于是我们将图片根据两条对角线划分为四个区域: A, A‘, A",A"‘.然后依次替换四个位置的值,维护左上角的值。我们要做的就是将上边替换到右边,右边替换到下边,下边替换到左边。实际上完成的就是A ->A‘->A"->A"‘->A ,实现四个区域的替换。所以外层循环从0~matrix.size()/2, 内层循环根据对角线从i ~ matrix.size() - i -1.我们唯一要注意的就是替换左边的确定,具体可以画图得到。可以参考如下的图加以理解。根据旋转中不变的长度来判断。

技术分享

AC Code:

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        
        for(int i = 0; i < n/2; i++)
        {
            for(int j = i; j < n - 1 - i; j++)
            {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n-1-j][i];
                matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
                matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
                matrix[j][n-1-i] = tmp;
            }
        }
        
        return;
    }
};

Answer 2: 转置法 (程序更简洁)

思路1:先得到原矩阵的转置矩阵,之后从转置矩阵到旋转矩阵再reverse每行的元素即可。

思路2:先上下折叠原矩阵,再计算折叠矩阵的转置矩阵,即所求矩阵。

有图好理解,矩阵如下图:

技术分享

Attention:

求转置矩阵时,将下三角矩阵和上三角矩阵元素交换。注意循环的里外层范围确定。

 for(int i=0,n=matrix.size();i<n;++i){  
            for(int j=i+1;j<n;++j)  

AC Code1:

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        
        for(int i = 0; i < n; i++)
        {
            for(int j = i+1; j < n; j++)
            {
                swap(matrix[i][j], matrix[j][i]);
            }
            reverse(matrix[i].begin(), matrix[i].end());
        }
        
        return;
    }
};


AC Code2:

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        reverse(matrix.begin(), matrix.end());
        
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                swap(matrix[i][j], matrix[j][i]);
            }
        }
        
        return;
    }
};




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。