【 每天学习一点算法 2026/04/21】螺旋矩阵

每天学习一点算法 2026/04/21

题目:螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

我们简单分析一下返回的循序:

  1. 第 1 行,1 ~ n
  2. 第 n 列,2 ~ m
  3. 第 m 行,n - 1 ~ 1
  4. 第 1 列,m - 1 ~ 2
  5. 第 2 行,2 ~ n - 1
  6. 第 n - 1 列,3 ~ m - 1
  7. 第 m - 1 行, n - 2 ~ 2
  8. 第 2 列,m - 2 ~ 3

其实已经可以看出规律是,每循环一圈,下一次就将每一个方向的范围两边都减少 1。

然后就是要考虑如何控制边界,我们只需要等到四个方向的某一个的范围左边界大于右边界时,表示已经遍历完成。

注意上面的范围时 1 ~ n 和 1 ~ m,数组下标是 0 开始的,范围要减一。

typescript 复制代码
function spiralOrder(matrix: number[][]): number[] {
  const res = [] // 结果数组
  const m = matrix.length
  const n = matrix[0].length
  let level = 0 // 层级
  // 循环遍历直到范围无效
  while (true) {
    // 上方
    if (level <= n - level - 1) {
      for (let i = level; i < n - level; i++) {
        res.push(matrix[level][i])
      }
    } else {
      return res
    }
	// 右方
    if (level + 1 <= m - level - 1) {
      for (let i = level + 1; i < m - level; i++) {
        res.push(matrix[i][n - level - 1])
      }
    } else {
      return res
    }
	// 下方
    if (n - level - 2 >= level) {
      for (let i = n - level - 2; i >= level; i--) {
        res.push(matrix[m - level - 1][i])
      }
    } else {
      return res
    }
	// 左方
    if (m - level - 2 >= level + 1) {
      for (let i = m - level - 2; i >= level + 1; i--) {
        res.push(matrix[i][level])
      }
    } else {
      return res
    }

    level++
  }
};

如果觉得上面这种遍历边界判断太绕了也可以这样:

  1. 第 1 行,1 ~ n
  2. 第 n 列,2 ~ m - 1
  3. 第 m 行,n ~ 1
  4. 第 1 列,m - 1 ~ 2
  5. 第 2 行,2 ~ n - 1
  6. 第 n - 1 列,3 ~ m - 2
  7. 第 m - 1 行, n - 1 ~ 2
  8. 第 2 列,m - 2 ~ 3

也就是上下都取满,左右取夹在上下中间的部分,但是要先取上下,再取左右,代码这里就不写了。

题目来源:力扣(LeetCode)

相关推荐
一只小菜鸡..3 分钟前
Stanford CS144 学习笔记 (四):网络拥塞控制与 AIMD 算法
网络·笔记·学习
gaosushexiangji5 分钟前
数字图像相关DIC系统在结构振动模态测量中的应用
算法
KaMeidebaby16 分钟前
卡梅德生物技术快报|如何制备单克隆抗体:小众禽类靶点单抗制备实操流程:双载体抗原交叉筛选完整工艺记录
人工智能·python·深度学习·算法·机器学习
xuhaoyu_cpp_java1 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
北域码匠1 小时前
Karatsuba乘法超详细解析(原理+流程+性能分析+纯原生C#无第三方库完整实现)
算法·c#·大数乘法·高精度计算·数据结构与算法·分治算法·karatsuba 乘法
fpcc2 小时前
数据结构和算法—数学的应用
数据结构·c++·算法
皓月斯语2 小时前
B4451 [GESP202512 四级] 建造 题解
数据结构·c++·算法·题解
z小猫不吃鱼2 小时前
模型剪枝经典论文精读:DepGraph: Towards Any Structural Pruning
算法·机器学习·剪枝
Ulyanov3 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
Eira-Z3 小时前
git(持续学习中...)
git·学习