Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 17-旋转图像.mdx
目录
题目思路
1348 字
约 4 分钟
更新于 2026/08/20

旋转图像

题目:

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

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

示例 1:

实例1图片地址

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

实例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]]

提示:

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

思路:

假如元素位置是:[i, j] 的话,由给的例子中可以观察到,元素位置经过旋转后,位置由第 i 行,第 j 个,变为倒数第 i 行 ,第 j 个。(这里说的是位置,而不是元素下标)

将其位置转换为对应的下标,即:元素由 [i, j],变为 [j, nums.length - 1 - i]。

这既是旋转前后元素对应的坐标变化。

根据旋转的特性可以知道,每次旋转,类似于这样的情况(以矩阵长度为4 举例) :

A -> B , B -> C, C -> D, D -> A

这里官方题解,解释的很好,可以参考官方题解。

官方题解

代码:

 const rotate = (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++) { // 横向循环的限制
                [
                    matrix[j][n - 1 - i], matrix[n - 1 - i][n - 1 - j], matrix[n - 1 - j][i], matrix[i][j] // 旋转后的位置
                ]
                    =
                [
                    matrix[i][j], matrix[j][n - 1 - i], matrix[n - 1 - i][n - 1 - j], matrix[n - 1 - j][i] // 对应旋转前的位置
                ]
            }
        }
        return matrix
    }