516 字
3 分钟
旋转图像

题目描述#

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

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

解题思路#

  1. 分层旋转
    • 将矩阵视为同心方框,从外层向内层旋转
  2. 元素分组交换
    • 每层分为4个元素一组(四个角)
    • 每组元素顺时针轮换位置
  3. 索引映射
    • 计算旋转后坐标关系:(i,j) → (j,n-1-i)
  4. 临时变量辅助
    • 使用单个临时变量完成4个元素的交换
  5. 范围控制
    • 外层循环处理 n//2 层
    • 内层循环处理 n-2*i-1 个元素

关键洞察#

  1. 旋转等价性
    • 顺时针90° = 转置 + 水平翻转
    • 逆时针90° = 转置 + 垂直翻转
  2. 位置映射规律
    • matrix[i][j] → matrix[j][n-1-i]
  3. 分层优化
    • 避免整体转置的内存开销
  4. 原地操作
    • 仅需常数额外空间
  5. 对称性利用
    • 每组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;
}
}
};

实际应用场景#

  1. 图像处理:图片查看器的旋转功能`
  2. 游戏开发:俄罗斯方块方块旋转`
  3. 计算机视觉:特征匹配前的图像对齐`
  4. 数据可视化:热力图坐标系转换`

相似题目#

旋转图像
https://website-truelovings-projects.vercel.app/posts/algorithms/旋转图像/
作者
欢迎来到StarSky的网站!
发布于
2025-08-28
许可协议
CC BY-NC-SA 4.0