Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-04-25

旋转图像

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

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

如下图所示,我们可以把3*3矩阵从外到里分为Math.floor(n / 2) = 1环,每环的数据按顺时针旋转交换数值。 下面的矩阵只有一环:1 2 3 6 9 8 7 4,将对应四个方向上值交换即可

旋转1

如果是4*4矩阵,可以分为Math.floor(n / 2) = 2环

旋转2

其它的矩阵都是一样的操作,无非就是在上述矩阵上加减环

具体实现步骤:

  1. 将矩阵分为i = Math.floor(n / 2)个可旋转的环
  2. 每一环按 j = i 到 j <= n - 1 - i进行数值遍历替换,这里的length = (n - 1 - i) - i永远会是4或者2,保证每环的一行数据完整遍历且不越界 举个栗子 4*4的矩阵旋转: 第一环坐标为: (0,0) (0,1) (0,2) (0,3) ,(0,0)代表第一环的第i(0)个交换值 第二环坐标为: (1,1) (1,2)
  3. 计算四个点(最内层2*2旋转同样适用) 每个坐标值都有对应的四个点,以第一环(0, 1)为例四个交换坐标为:(0,1) (1, 3) (3, 2) (2, 0),观察规律我们可以得到四个点的计算公式:(i, j) (j, n - 1 - i) (n - 1 - i, n - 1 - i) (n - 1 - j, i),将四个点的值按顺时针替换即可。

最总代码:

const rotateMatrix = (matrix) => {
  // 交换列
  const circle = Math.floor(matrix.length / 2)
  // 将矩阵分为Math.floor(n / 2)个环
  for (let i = 0; i < circle; i++) {
    // 从 i 遍历到matrix[i].length - 1 - i
    for (let j = i; j < matrix[i].length - 1 - i; j++) {
      // 四个坐标点互相交换值
      ;[
        matrix[i][j],
        matrix[j][matrix.length - 1 - i],
        matrix[matrix.length - 1 - i][matrix.length - 1 - j],
        matrix[matrix.length - 1 - j][i]
      ] = [
        matrix[matrix.length - 1 - j][i],
        matrix[i][j],
        matrix[j][matrix.length - 1 - i],
        matrix[matrix.length - 1 - i][matrix.length - 1 - j]
      ]
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

如果是逆势针旋转,步骤同上只需要将(i, j) (j, n - 1 - i) (n - 1 - i, n - 1 - i) (n - 1 - j, i)坐标值的交换顺序变为逆时针即可。

提示

使用解构赋值来避免多余变量的创建

上次更新: 2025/09/05, 8:09:00
有效的数独
缺失的第一个正整数

← 有效的数独 缺失的第一个正整数→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev