Leetcode48 Rotate Image

描述:一个n*n的矩阵,将其顺时针转90°(不允许申请额外的矩阵)

Example:

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]
]
Given input matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

rotate the input matrix in-place such that it becomes:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

考虑这个题的时候可以先手动算一下顺时针旋转90°的过程,会发现旋转是按层进行的,从最外层到最里层,因此比较容易想到的做法就是dfs:

   以下是我的代码,需要手动计算进行理解:

  

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        rotate(matrix, 0, matrix.size() - 1);
    }
    void rotate(vector<vector<int>>& matrix, int start, int end)
    {
        if(end == start || start > end)
            return;
        for(int i = 0; i < end - start; i++)    //这里i的范围一定要注意,因为start不一定是从0开始的
        {
            int tmp = matrix[start][start + i];
            matrix[start][start + i] = matrix[end - i][start];
            matrix[end - i][start] = matrix[end][end - i];
            matrix[end][end - i] = matrix[start + i][end];
            matrix[start+i][end] = tmp;
        }
        rotate(matrix, start + 1,end - 1);
    }
};

这种方法是通过复制来实现矩阵旋转,看解析的时候发现也可以通过交换来实现矩阵旋转:

 1  2  3  4    13  9  5  4     13 9 5 4    13  9 5 1
 5        8     3        8     16     8    16      2
 9       12  => 2       12  => 15    12 => 15      3
13 14 15 16     1 14 15 16     14 3 2 1    14 12 8 4 

 6  7       10 7     10 7      10 6
10 11  =>   6 11  => 11 6  =>  11 7
class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        for(int i = 0; i < n/2; i++) // for each loop
            for(int j = i; j < n - i - 1; j++){
                swap(matrix[i][j], matrix[n-1-j][i]);
                swap(matrix[n-1-j][i], matrix[n-1-i][n-1-j]);
                swap(matrix[n-1-i][n-1-j], matrix[j][n-1-i]);
            }
    }
};

巧妙地利用矩阵反转的特性,先沿主对角线翻转,再沿垂直中心线翻转

void rotate(vector<vector<int>>& matrix) {
    for (unsigned int i=0; i<matrix.size(); i++) // transpose
        for (unsigned int j=0; j<i; j++)
            swap(matrix[i][j], matrix[j][i]);
    for (auto& row: matrix)  // reverse
        reverse(row.begin(), row.end());
}

还有一种做法是利用vector的性质

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        for(int n = 0; n < matrix.size(); n++)
        {
            for(int m = matrix.size()-1; m >= 0; m--)
            {
                matrix[n].push_back(matrix[m][n]);
            }
        }
        for(int n = 0; n < matrix.size(); n++)
        {
            matrix[n].erase(matrix[n].begin(),matrix[n].begin() + matrix.size());
        }
    }
};

以上除了第一种做法之外,均为leetcode   Discuss区大神的方法,用来借鉴!

下载前必看:https://pan.quark.cn/s/744f26e0d658 标题“安良H3D 多功能限时继电器.pdf”中的知识点涉及继电器的技术细节和功能特性。 继电器是一种电控制装置,广泛应用于电子、电力、自动化及通信系统中,其主要功能是在输入电路中由小功率控制大功率电路的一种自动开关。 限时继电器则是具备时间控制功能的继电器,可以在设定时间后延迟动作或是在设定时间内动作,从而实现时间控制。 从描述和标签“安良H3D 多功能限时继电器pdf, 安良H3D 多功能限时继电器”中,可以推测这份PDF文件是对特定型号H3D继电器的技术说明文档,它强调了该继电器的多功能特性,意味着该设备不仅仅是简单的定时器,可能还集成了多种功能,例如过载保护、故障报警、远程控制等。 标签“综合资料”则表明这是一份综合性的技术资料,为使用者提供全面的继电器信息。 关于文档中部分内容的分析,虽然文档信息不是完全准确,但可以推断其描述了该继电器的相关技术参数、功能应用和操作说明。 以下是对这部分内容的详细解读:继电器名称“H3D-M”表明这是安良公司生产的H3D型号系列中的M型继电器。 文档中提到的“使用了H3D-M继电器”可能说明该文档提供了该型号继电器的具体应用案例或示例。 接着,“价值了H3D-M继电器”可能是指H3D-M继电器被使用或实现的功能。 从上下文看,这些功能包括定时控制、安全保护、远程通信等。 在安全保护方面,继电器可实现过载保护,防止系统过载引发的故障。 远程通信则意味着该继电器可能具备网络接口,能通过网络接受控制指令或发送状态信息。 文档中还提到“实现了H3D-M继电器的多种功能”,表明继电器集成了多项功能,如可以进行定时控制、保护和信号采集等多种操作。 这说明继电器不仅具有基本的...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值