美文网首页程序员
48. Rotate Image

48. Rotate Image

作者: Nautilus1 | 来源:发表于2017-10-27 14:15 被阅读0次

题目描述:给一个n * n的二维数组表示的图片,将其原地顺时针旋转90度。如:

Given input matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
rotate the input matrix in-place such that it becomes:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

分析:如果可以重新申请一个 n * n 的矩阵,则分析元素变换前后的位置关系可得:
A[ i ][ j ] <——> A[ j ][ n - 1 - i],代码如下:

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> v(n);       //vector必须先指明其大小才能用下标赋值,这一步只指明了一层
        for (int i = 0; i < n ; i ++)
            v[i].resize(n);              //每层大小为n
        
        for (int i = 0; i < n ; i ++)
        {
            for (int j = 0; j < n ; j ++)
                v[j][n - 1 - i] = matrix[i][j];
        }
        
        for (int i = 0; i < n ; i ++)
        {
            for (int j = 0; j < n ; j ++)
                cout<<v[i][j]<<" ";      //改为matrix[i][j] = v[i][j]; 也可通过
            cout<<endl;
        }
    }
};

但是已规定原地和变换,且原函数无返回值,即输入矩阵matrix默认为评测对象,若修改其他矩阵返回的仍是原输入矩阵。

代码:先沿着副对角线翻转一次,再沿着水平中线翻转一次。时间复杂度O(n^2),空间O(1)。先沿着水平中线翻转一次,再沿着副对角线翻转一次也是一样的,复杂度相同。

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

相关文章

网友评论

    本文标题:48. Rotate Image

    本文链接:https://www.haomeiwen.com/subject/fqrrpxtx.html