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度后的结果。具体的流程如下图:

上面的先将图像进行水平对称,然后进行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)。

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

时间: 2024-11-03 11:15:45

LeetCode_Rotate Image的相关文章

leetcode_Rotate Array

描述: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. Note: Try to come up as many solutions as you can, there are at least 3 different ways to solve thi