数据结构与算法-1 :旋转图像

简介: 从本文开始,我将开启一个新的系列文章的编写数据结构与算法,在本系列文章中,我将对牛客、LeetCode等主流算法刷题平台的精彩题目进行讲解,实现语言包括Python(主)、Javascript、C、C++,同时我也会将相关算法与我们的实际开发项目结合,帮助大家更好的理解这略显枯燥的算法。

前言


从本文开始,我将开启一个新的系列文章的编写数据结构与算法,在本系列文章中,我将对牛客LeetCode等主流算法刷题平台的精彩题目进行讲解,实现语言包括Python(主)、Javascript、C、C++,同时我也会将相关算法与我们的实际开发项目结合,帮助大家更好的理解这略显枯燥的算法。


【LeetCode】题目描述


给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。


示例1:


给定 matrix =
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]


示例 2:


给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]


思路提供



01 - 矩阵旋转示意图


观察转化前后的矩阵对应元素,不难发现:


微信图片_20220610232537.png

图1.1 数字翻转示意图


微信图片_20220610232546.png

图1.2 数字翻转示意图


微信图片_20220610232551.png

图1.3 数字翻转示意图


微信图片_20220610232555.png

图1.4 数字翻转示意图



02 - 总结思路


用arr代表二维数组 i、j 表示数组对应下标,替换过程为 :


  1. 记录当前元素 tmp=arr[0][0]
  2. 顺时针开始逐一替换
  • arr[0][0]=arr[3][0]
  • arr[3][0]=arr[3][3]
  • arr[3][3]=arr[0][3]
  • arr[0][3]=tmp


进而将这种情况推广到一般状态下即为 :


  • tmp = arr[i][j]
  • matrix[i][j] = matrix[n-1-j][i]
  • matrix[n-1-j][i] = matrix[n-1-i][n-1-j]
  • matrix[n-1-i][n-1-j] = matrix[j][n-1-i]
  • matrix[j][n-1-i] = temp



03 - 结论


观察变化前后的数组可知 , 先将数组的行进行翻转 , 然后再求翻转后矩阵的转置矩阵即可。


代码展示


  • Python


class Solution:
      def rotate(self, matrix):
          """
          :type matrix: List[List[int]]
          :rtype: void Do not return anything, modify matrix in-place instead.
          """
          matrix.reverse()
          for i in range(len(matrix)):
              for j in range(i):
                  matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]


  • C++


class Solution {
  public:
      void rotate(vector<vector<int>>& matrix) {
          unsignedint n = matrix.size();
          for(unsignedint i = 0; i < n/2; ++i){
              for(unsignedint j = i; j < n - 1 - i; ++j){
                  int temp = matrix[i][j];
                  matrix[i][j] = matrix[n-1-j][i];
                  matrix[n-1-j][i] = matrix[n-1-i][n-1-j];
                  matrix[n-1-i][n-1-j] = matrix[j][n-1-i];
                  matrix[j][n-1-i] = temp;
              }
          }
      }
  };



本文总结


在本文中,我们通过简单的几个示意图讲解了如何对一个四阶矩阵进行原地(顺时针)旋转,并通过分析矩阵中的元素位置,将元素一般替换过程推广到普适的替换过程,最终得出本题的思路,我们最后还通过Python、C++对这个题目进行了实现,小伙伴们学会了吗?快去实现一


相关文章
|
2月前
|
编解码 算法
改进SIFT算法实现光学图像和SAR图像配准
改进SIFT算法实现光学图像和SAR图像配准
|
23天前
|
存储 监控 算法
基于文化优化算法图像量化(Matlab代码实现)
基于文化优化算法图像量化(Matlab代码实现)
|
15天前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
3月前
|
机器学习/深度学习 监控 算法
基于单尺度Retinex和多尺度Retinex的图像增强算法实现
基于单尺度Retinex(SSR)和多尺度Retinex(MSR)的图像增强算法实现
191 1
|
3月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
3月前
|
监控 算法 决策智能
基于盲源分离与贝叶斯非局部均值的图像降噪算法
基于盲源分离与贝叶斯非局部均值的图像降噪算法
85 0
|
4月前
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
4月前
|
存储 算法 数据安全/隐私保护
基于DNA算法的遥感图像加解密matlab仿真
本程序基于DNA算法实现遥感图像加密与解密,利用DNA分子双螺旋结构和碱基配对规则完成信息编码。主要步骤包括图像预处理、DNA编码、DNA操作(杂交、酶切、连接)及密钥生成管理。通过直方图、相关性、熵和解密后图像质量分析验证效果。程序在MATLAB2022A版本运行,具有高效性和安全性,但需解决操作准确性与密钥管理复杂性等挑战。
|
6月前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
206 35
|
4月前
|
算法 安全 数据安全/隐私保护
基于AES的图像加解密算法matlab仿真,带GUI界面
本程序基于AES算法实现图像的加解密功能,并提供MATLAB GUI界面操作,支持加密与解密。运行环境为MATLAB 2022A,测试结果无水印。核心代码通过按钮回调函数完成AES加密与解密流程,包括字节替换、行移位、列混淆及密钥加等步骤。解密过程为加密逆向操作,确保数据安全性与完整性。完整程序结合128位块加密与可选密钥长度,适用于图像信息安全场景。

热门文章

最新文章