LeetCode48. Rotate Image题解

1.题目描述

You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise).
【翻译过来】:题目很简单,给了一个n*n的2D方阵,我们需要将其顺时针旋转90°。

2. 分析

咋看之下,题目其实很简单,而我check了一下发现这道题竟然是中等难度,通过率也是才38%,不过我们还是先分析一下。

2.1. 方案1

举个例子就很好懂了,观察下面这个矩阵:

a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a43 a44

经过顺时针旋转90°之后变为以下矩阵:

a41 a31 a21 a11
a42 a32 a22 a12
a43 a33 a23 a13
a44 a34 a24 a14

我们需要以行和列为整体观察,即:我们观察每一列和每一行的位置变化情况:

  • 原矩阵中第一列的逆置成为新矩阵的第一行;
  • 原矩阵中第二列的逆置成为新矩阵的第二行;
  • 原矩阵中第三列的逆置成为新矩阵的第三行;
  • 原矩阵中第四列的逆置成为新矩阵的第四行;

即:原矩阵第i列的逆置成为新矩阵的第i行。
得到这个结论之后就容易操作了,很简单,我们遍历的时候按照列优先开始遍历,遍历完一列之后进行逆置,作为新矩阵的行即可。
这里写图片描述

2.2. 方案2

看了讨论区别人的算法,有一个同样为O(n^2)复杂度的算法,不过空间复杂度要比我们的低一些,直接交换某些元素对应位置即可。它的核心思想是其实元素是按照一个环进行移动的,掌握这个环的规律移动位置即可。

3. 源码

3.1. 方案1

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int N = matrix.size();
        vector<vector<int> >temp = matrix;
        matrix.clear();
        vector<int> row;
        for (int j = 0; j < N; j++) {
            for (int i = 0; i < N; i++) {
                row.push_back(temp[i][j]);
            }
            reverse(row.begin(), row.end());
            matrix.push_back(row);
            row.clear();
        }
    }
};

3.2. 方案2

public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length, temp;
        for(int i = 0; i < n / 2; i++)
            for(int j = i; j < n - i - 1; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
    }
}

4. 心得

虽然是一道中等难度的题目,但是难度还不是很大。不过涉及到逆置的操作是直接用了里面的reverse(V.begin(), V.end())。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值