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

力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)

在解决力扣第48题“旋转图像”时,题目要求将一个 n × n 的矩阵原地顺时针旋转90度(即不使用额外空间)。我采用的是一种直接通过交换四个位置元素的方法来实现旋转。这种方法高效且直观,下面详细解释我的思路和代码。

问题分析

给定一个 n × n 的二维矩阵,我们需要将其顺时针旋转90度。旋转后的矩阵需要满足:

  • 矩阵元素的位置变化规律:原始位置 (i, j) 的元素会移动到 (j, n-1-i)
  • 必须在原矩阵上修改,空间复杂度为 O(1)

核心思想:

核心思路:四个元素一组循环交换

观察旋转的规律,我们可以发现矩阵中的四个元素会构成一个循环

  1. 原始位置 (i, j) 移动到 (j, n-1-i)
  2. 位置 (j, n-1-i) 移动到 (n-1-i, n-1-j)
  3. 位置 (n-1-i, n-1-j) 移动到 (n-1-j, i)
  4. 位置 (n-1-j, i) 移动到 (i, j)

这个过程形成了一个闭环,我们可以用一个临时变量 temp 来辅助这四个位置的元素交换:

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;

遍历范围的设计

如果直接遍历整个矩阵,每个元素会被交换两次(导致恢复原状)。我们需要确保每个元素只被交换一次。解决方案是只遍历矩阵的左上角区域

  • 行索引 i:从 0 到 n/2(不包括 n/2)。
  • 列索引 j:从 0 到 (n+1)/2(不包括 (n+1)/2)。

为什么列的范围是 (n+1)/2

  • 当 n 是偶数时,遍历左上角的四分之一区域:
    • i 的范围:[0, n/2)
    • j 的范围:[0, n/2)
  • 当 n 是奇数时,中心元素无需旋转,但中心列的上半部分需要处理:
    • 列的范围扩展到 (n+1)/2,确保覆盖中心列左侧的所有列(见下图)。
示例:n=3(奇数)
需要遍历的位置:(0,0) 和 (0,1)(0,0) -> (2,0) -> (2,2) -> (0,2)(0,1) -> (1,0) -> (2,1) -> (1,2)
中心点 (1,1) 保持不变。

代码实现
class Solution {public void rotate(int[][] matrix) {int n = matrix.length; // 矩阵尺寸 n x n// 遍历左上角区域for (int i = 0; i < n / 2; i++) {for (int j = 0; j < (n + 1) / 2; 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;}}}
}

示例解析

3x3 矩阵为例:

初始矩阵:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

第一步:旋转 (0,0) 所在的组:

  • (0,0) → (2,0) → (2,2) → (0,2) → (0,0)
  • 交换后:
  [7, 2, 1][4, 5, 6][9, 8, 3]

第二步:旋转 (0,1) 所在的组:

  • (0,1) → (1,0) → (2,1) → (1,2) → (0,1)
  • 交换后:
  [7, 4, 1][8, 5, 2][9, 6, 3]

最终得到顺时针旋转90度的结果。

复杂度分析
  • 时间复杂度O(n²),每个元素被访问一次。
  • 空间复杂度O(1),仅使用常数级额外空间。
总结

通过将矩阵分为四个位置的循环组,并巧妙设计遍历范围(左上角区域),我们在原地完成了矩阵旋转。这种方法避免了额外的空间开销,且逻辑清晰高效。理解位置映射关系 (i, j) → (j, n-1-i) 是解决本题的关键。


文章转载自:

http://gmO4YhRt.rkscm.cn
http://hW0TRuNq.rkscm.cn
http://H94O6AgF.rkscm.cn
http://QVHTd4rw.rkscm.cn
http://iRCpsPdg.rkscm.cn
http://pV9M3BuN.rkscm.cn
http://urwHWSjB.rkscm.cn
http://QlFiB8dh.rkscm.cn
http://j0l7GJkX.rkscm.cn
http://BUH0pnrv.rkscm.cn
http://7bjE7Na6.rkscm.cn
http://QGjdZhyS.rkscm.cn
http://rplbe9Xz.rkscm.cn
http://G1Mu6GbP.rkscm.cn
http://izlKGrbV.rkscm.cn
http://adVpPXzh.rkscm.cn
http://7YpPYTaE.rkscm.cn
http://8gXduo1y.rkscm.cn
http://UnR05kJB.rkscm.cn
http://d16z535B.rkscm.cn
http://4MYHeU2i.rkscm.cn
http://O4FzX1uh.rkscm.cn
http://qdVTp5tk.rkscm.cn
http://GdWQSK0B.rkscm.cn
http://d092rfQv.rkscm.cn
http://0985gB5M.rkscm.cn
http://QGIMUN3U.rkscm.cn
http://OOoZ2s2T.rkscm.cn
http://GUrhwEa9.rkscm.cn
http://8kSgTDqr.rkscm.cn
http://www.dtcms.com/a/369081.html

相关文章:

  • U盘文件系统转换指南:方法、原因与注意事项
  • AI智能优化SEO关键词策略实战
  • 共享线程池对@Scheduled定时任务的影响
  • 一张图看懂AI时代后端系统架构
  • 人工智能学习:什么是GRU模型
  • 高效管理网络段和端口集合的工具之ipset
  • 为什么要用VR全景?5个答案告诉你
  • 【Linux学习笔记】信号的深入理解之软件条件产生信号
  • 前端事件循环:代码世界的“排队”艺术!
  • JP4-7-MyLesson后台前端(一)
  • PPIO上线kimi-k2-0905,编码能力大幅提升
  • UniApp 页面通讯方案全解析:从 API 到状态管理的最佳实践
  • 嵌入式|Linux中打开视频流的两种方式V4l2和opencv
  • VBA 中的 Excel 工作表函数
  • Unix/Linux 平台通过 IP 地址获取接口名的 C++ 实现
  • EXCEL列数据前面补零
  • Big Data Analysis
  • 拿到一组数据在mars3d上渲染报错排查思路
  • 力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
  • 《从报错到运行:STM32G4 工程在 Keil 中的头文件配置与调试实战》
  • Meta AI眼镜Hypernova量产临近,微美全息构筑护城河引领人机交互变革浪潮
  • SQL表一共有几种写入方式
  • Vue3源码reactivity响应式篇之ReactiveEffect类
  • C++中的Reactor和Proactor模型进行系统性解析
  • 调试技巧:Chrome DevTools 与 Node.js Inspector
  • 双碳目标下的24小时分时综合能源系统低碳优化调度:基于 Matlab/YALMIP/CPLEX的方法与仿真
  • 告别 “无效阅读”!2025 开学季超赞科技书单,带孩子解锁 AI、编程新技能
  • 鸿蒙Next的UI国际化与无障碍适老化实践:构建全球包容的数字世界
  • react 全屏页面自适应操作,注意问题
  • 计算机毕设选题:基于Python数据挖掘的高考志愿推荐系统