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区大神的方法,用来借鉴!

内容概要:本文档详细介绍了基于MATLAB实现的多头长短期记忆网络(MH-LSTM)结合Transformer编码器进行多变量时间序列预测的项目实例。项目旨在通过融合MH-LSTM对时序动态的细致学习和Transformer对全局依赖的捕捉,显著提升多变量时间序列预测的精度和稳定性。文档涵盖了从项目背景、目标意义、挑战与解决方案、模型架构及代码示例,到具体的应用领域、部署与应用、未来改进方向等方面的全面内容。项目不仅展示了技术实现细节,还提供了从数据预处理、模型构建与训练到性能评估的全流程指导。 适合人群:具备一定编程基础,特别是熟悉MATLAB和深度学习基础知识的研发人员、数据科学家以及从事时间序列预测研究的专业人士。 使用场景及目标:①深入理解MH-LSTM与Transformer结合的多变量时间序列预测模型原理;②掌握MATLAB环境下复杂神经网络的搭建、训练及优化技巧;③应用于金融风险管理、智能电网负荷预测、气象预报、交通流量预测、工业设备健康监测、医疗数据分析、供应链需求预测等多个实际场景,以提高预测精度和决策质量。 阅读建议:此资源不仅适用于希望深入了解多变量时间序列预测技术的读者,也适合希望通过MATLAB实现复杂深度学习模型的开发者。建议读者在学习过程中结合提供的代码示例进行实践操作,并关注模型训练中的关键步骤和超参数调优策略,以便更好地应用于实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值