LeetCode_Rotate Image

一.题目

Rotate Image

  Total Accepted: 32380 Total Submissions: 102010My Submissions

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?

Show Tags
Have you met this question in a real interview?  
Yes
 
No

Discuss







二.解题技巧

    由于要求将图像顺时针旋转90度,最简单的做法就是画个图出来观察旋转90度之后的图像的情况,经过分析可知,顺时针旋转90度就是将原来的图像的最后一行作为第一列,倒数第二行作为第二列,因此类推,第一行作为最后一列。如果直接根据这种做法来做,由于要找到原始图像的坐标与旋转后对应的坐标之间的关系比较难,只能创建一个大小为n*n的临时图像来进行复制操作,然后将旋转后的图像复制回原来的图像中。这种做法的时间复杂度为O(n^2),空间复杂度为O(n^2)。
    由于无论图像进行什么角度的选择,左上角的点都可以看作坐标系的原点,因此,将原始的图像抽象为一个四个顶点分别为1-2-3-4的矩形,顺时针旋转90度之后的图像的抽象即为四个顶点分别为4-1-2-3的矩形。对于这种结果,可以先将原始图像进行水平对称,这样,得到图像的抽象为2-1-4-3,然后将水平对称后的图像进行沿着对角线的对称,得到的抽象即为4-1-2-3,即可得到旋转90度后的结果。具体的流程如下图:
LeetCode_Rotate Image_第1张图片

    上面的先将图像进行水平对称,然后进行45度对称的方法,时间复杂度为O(n^2), 空间复杂度为O(1)。



三.实现代码

#include <iostream>
#include <vector>

using namespace std;

class Solution
{

private:
    void Mirror(vector<vector<int> >& matrix)
    {
        const int N = matrix.size();
        const int Half = N / 2;

        for (int IndexOfRows = 0; IndexOfRows < N; IndexOfRows++)
        {
            for (int IndexOfCols = 0; IndexOfCols < Half; IndexOfCols++)
            {
                int Tmp = matrix[IndexOfRows][IndexOfCols];
                matrix[IndexOfRows][IndexOfCols] = matrix[IndexOfRows][N - 1 - IndexOfCols];
                matrix[IndexOfRows][N - 1 - IndexOfCols] = Tmp;
            }
        }

    }

    void RotateFour(vector<vector<int> >& matrix)
    {
        const int N = matrix.size();

        for (int IndexOfRows = 0; IndexOfRows < N - 1; IndexOfRows++)
        {
            for (int IndexOfCols = 0; IndexOfCols < N - 1 - IndexOfRows; IndexOfCols++)
            {
                int Tmp = matrix[IndexOfRows][IndexOfCols];
                matrix[IndexOfRows][IndexOfCols] = matrix[N - 1 - IndexOfCols][N - 1 - IndexOfRows];
                matrix[N - 1 - IndexOfCols][N - 1 - IndexOfRows] = Tmp;
            }
        }

    }

public:
    void rotate(vector<vector<int> > &matrix)
    {
        // 水平对称
        Mirror(matrix);


        // 45度对称
        RotateFour(matrix);
    }
};




四.体会

    这道题有点小技巧在里面,由于是需要in-place进行,我的理解是空间复杂度为O(1),因此,应该考虑旋转后的图片与原来的图片的关系,根据上面的分析可以知道,旋转后的图片就是先将原来的图片进行水平对称,然后再进行45度对称,因此,而进行对称是完全可以in-place进行的,因此,按照上面的做法,空间复杂度为O(1)。



版权所有,欢迎转载,转载请注明出处,谢谢微笑




你可能感兴趣的:(LeetCode,Algorithm,C++)