当前位置: 首页 > news >正文

代码训练LeetCode(45)旋转图像

代码训练(45)旋转图像

Author: Once Day Date: 2025年7月11日

漫漫长路,才刚刚开始…

全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客

参考文章:

  • 48. 旋转图像 - 力扣(LeetCode)
  • 力扣 (LeetCode) 全球极客挚爱的技术成长平台

文章目录

      • 代码训练(45)旋转图像
        • 1. 原题
        • 2. 分析
        • 3. 代码实现
        • 4. 总结

1. 原题

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

示例 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]]
2. 分析

该问题要求我们给定一个 n×n 的二维矩阵,代表一个图像,需要将图像顺时针旋转 90 度。重点在于“原地”操作,即不使用额外的存储空间来完成这个旋转。

原理分析,顺时针旋转 90 度意味着:

  • 第一行变成了最后一列。
  • 第二行变成了倒数第二列。
  • 依此类推,直到最后一行变成了第一列。

解题思路:

  1. 转置矩阵:首先对矩阵进行转置,即行列互换。转置后,matrix[i][j] 会变成 matrix[j][i]。
  2. 反转每一行:将转置后的每一行进行反转,即第一个元素和最后一个元素交换,第二个和倒数第二个交换,依此类推。

分析步骤,以 3x3 矩阵为例,进行以下操作:

原始矩阵:

1 2 3
4 5 6
7 8 9

转置后:

1 4 7
2 5 8
3 6 9

每一行反转后:

7 4 1
8 5 2
9 6 3

优化关键点:

  • 空间复杂度:由于是原地操作,不需要额外空间,空间复杂度为 O(1)。
  • 时间复杂度:操作涉及到两次遍历矩阵,时间复杂度为 O(n^2)。
3. 代码实现
void rotate(int** matrix, int matrixSize, int* matrixColSize) {// 转置矩阵for (int i = 0; i < matrixSize; i++) {for (int j = i; j < matrixSize; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}// 反转每一行for (int i = 0; i < matrixSize; i++) {for (int j = 0; j < matrixSize / 2; j++) {int temp = matrix[i][j];matrix[i][j] = matrix[i][matrixSize - 1 - j];matrix[i][matrixSize - 1 - j] = temp;}}
}
4. 总结

这个问题考验了对矩阵操作的理解和实现能力,特别是原地修改的技术。通过实践这类问题,可以加深对数组和矩阵操作的理解,提高编程能力和对复杂问题的处理能力。

http://www.lryc.cn/news/585952.html

相关文章:

  • 【Linux-云原生-笔记】Apache相关
  • 【Modern C++ Part9】Prefer-alias-declarations-to-typedefs
  • 内网穿透系列九:开源的网络穿透与组网工具 EasyTier,支持多种数据传输通道,去中心化,兼具高效与安全
  • Kafka Schema Registry:数据契约管理的利器
  • 对日开发 秀丸文本编辑器 添加文本变换模块
  • 聊一聊Spring框架接口测试常见场景有哪些?
  • 学习C++、QT---22(QT中QTextStream库读取文件、写入文件的讲解)
  • docker搭建 与镜像加速器
  • win10安装Rust Webassembly工具链(wasm-pack)报错。
  • C++中Lambda表达式 [ ] 的写法
  • AI 时代的分布式多模态数据处理实践:我的 ODPS 实践之旅、思考与展望
  • 深入解析 Stack 和 Queue:从原理到实战应用
  • 每日算法刷题Day46 7.12:leetcode前缀和3道题和差分2道题,用时1h30min
  • pgsql模板是什么?
  • Redis Geospatial 功能详解及多边形包含判断实现
  • 【JVM|类加载】第三天
  • 专业硬件检测工具 AIDA64 Extreme V7.70.7500 至尊版
  • 12. JVM的垃圾回收器
  • 1. 好的设计原则
  • Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
  • 钉钉小程序开发环境配置与前端开发指南
  • 【小沐杂货铺】基于Three.JS绘制汽车展示Car(WebGL、vue、react、autoshow、提供全部源代码)
  • 关于 验证码系统 详解
  • Ubuntu安装Jenkins
  • Java文件传输要点
  • 大数据在UI前端的应用深化研究:用户行为数据的时序模式挖掘
  • 前端内容-ES6
  • Java使用Langchai4j接入AI大模型的简单使用(一)
  • 【Linux网络】IP 协议详解:结构、地址与交付机制全面解析
  • 【PTA数据结构 | C语言版】阶乘的递归实现