516 字
3 分钟
旋转图像

题目描述
给定一个 n × n 的二维矩阵 matrix
表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
解题思路
- 分层旋转:
- 将矩阵视为同心方框,从外层向内层旋转
- 元素分组交换:
- 每层分为4个元素一组(四个角)
- 每组元素顺时针轮换位置
- 索引映射:
- 计算旋转后坐标关系:
(i,j) → (j,n-1-i)
- 计算旋转后坐标关系:
- 临时变量辅助:
- 使用单个临时变量完成4个元素的交换
- 范围控制:
- 外层循环处理
n//2
层 - 内层循环处理
n-2*i-1
个元素
- 外层循环处理
关键洞察
- 旋转等价性:
- 顺时针90° = 转置 + 水平翻转
- 逆时针90° = 转置 + 垂直翻转
- 位置映射规律:
matrix[i][j] → matrix[j][n-1-i]
- 分层优化:
- 避免整体转置的内存开销
- 原地操作:
- 仅需常数额外空间
- 对称性利用:
- 每组4个元素构成闭环交换
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n²):每个元素访问一次 |
空间复杂度 | O(1):仅需常数临时空间 |
最优情况 | O(1):1x1矩阵 |
最坏情况 | O(n²):大尺寸矩阵 |
代码实现
/** * @param {number[][]} matrix * @return {void} Do not return anything, modify matrix in-place instead. */var rotate = function (matrix) { const n = matrix.length; for (let i = 0; i < Math.floor(n / 2); i++) { for (let j = 0; j < Math.floor((n + 1) / 2); j++) { const temp = matrix[i][j]; matrix[i][j] = matrix[n - j - 1][i]; matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]; matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]; matrix[j][n - i - 1] = temp; } }};
实际应用场景
- 图像处理:图片查看器的旋转功能`
- 游戏开发:俄罗斯方块方块旋转`
- 计算机视觉:特征匹配前的图像对齐`
- 数据可视化:热力图坐标系转换`