每天学习一点算法 2026/04/21
题目:螺旋矩阵
给你一个
m行n列的矩阵matrix,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
我们简单分析一下返回的循序:
- 第 1 行,1 ~ n
- 第 n 列,2 ~ m
- 第 m 行,n - 1 ~ 1
- 第 1 列,m - 1 ~ 2
- 第 2 行,2 ~ n - 1
- 第 n - 1 列,3 ~ m - 1
- 第 m - 1 行, n - 2 ~ 2
- 第 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 ~ n
- 第 n 列,2 ~ m - 1
- 第 m 行,n ~ 1
- 第 1 列,m - 1 ~ 2
- 第 2 行,2 ~ n - 1
- 第 n - 1 列,3 ~ m - 2
- 第 m - 1 行, n - 1 ~ 2
- 第 2 列,m - 2 ~ 3

也就是上下都取满,左右取夹在上下中间的部分,但是要先取上下,再取左右,代码这里就不写了。
题目来源:力扣(LeetCode)