文章目录
题目链接:LeetCode CN - 螺旋矩阵
一、题目描述
给定一个 m x n 的二维矩阵 matrix,请按照 顺时针螺旋顺序 返回该矩阵中的所有元素。
示例输入:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
示例输出:
[1, 2, 3, 6, 9, 8, 7, 4, 5]
二、思路讲解
我们需要按照螺旋的顺序遍历矩阵------即 从左到右、从上到下、从右到左、从下到上 依次循环,直到所有元素都被访问完。
三、可视化流程解析
可以将矩阵的边界设定为四个变量:
top:当前剩余部分的上边界;bottom:当前剩余部分的下边界;left:当前剩余部分的左边界;right:当前剩余部分的右边界。
每一次循环遍历,按照以下顺序访问元素:
- 从左到右;
- 从上到下;
- 从右到左;
- 从下到上;
- 缩小边界范围。
Mermaid 流程图(螺旋遍历过程)
否
是
否
是
开始
是否已遍历完所有元素?
从左到右遍历 top 行
从上到下遍历 right 列
是否剩余多行多列?
从右到左遍历 bottom 行
从下到上遍历 left 列
缩小边界 top++, bottom--, left++, right--
结束
Mermaid 思维导图(整体思路)
螺旋矩阵
思路
定义四个边界
按顺序遍历
每次循环收缩边界
实现
条件判断防止越界
使用 while 循环遍历
时间复杂度
O(m*n)
空间复杂度
O(1)
四、逐步实例演示
以如下矩阵为例:
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
| 步骤 | 遍历方向 | 遍历元素 | 结果数组 |
|---|---|---|---|
| 1 | 从左到右 | 1, 2, 3 | [1, 2, 3] |
| 2 | 从上到下 | 6, 9 | [1, 2, 3, 6, 9] |
| 3 | 从右到左 | 8, 7 | [1, 2, 3, 6, 9, 8, 7] |
| 4 | 从下到上 | 4 | [1, 2, 3, 6, 9, 8, 7, 4] |
| 5 | 再次从左到右 | 5 | [1, 2, 3, 6, 9, 8, 7, 4, 5] |
完成遍历。
五、Java 实现代码
java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix == null || matrix.length == 0) return res;
int top = 0, bottom = matrix.length - 1;
int left = 0, right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
// 从左到右
for (int i = left; i <= right; i++) {
res.add(matrix[top][i]);
}
top++;
// 从上到下
for (int i = top; i <= bottom; i++) {
res.add(matrix[i][right]);
}
right--;
// 判断剩余是否还有行或列
if (top <= bottom) {
// 从右到左
for (int i = right; i >= left; i--) {
res.add(matrix[bottom][i]);
}
bottom--;
}
if (left <= right) {
// 从下到上
for (int i = bottom; i >= top; i--) {
res.add(matrix[i][left]);
}
left++;
}
}
return res;
}
}
六、复杂度分析
| 项目 | 说明 | 复杂度 |
|---|---|---|
| 时间复杂度 | 每个元素被访问一次 | O(m × n) |
| 空间复杂度 | 除输出外无额外存储 | O(1) |
七、总结
- 关键思想:利用四个边界控制螺旋遍历;
- 循环条件 :
top <= bottom && left <= right; - 注意点 :
- 每个方向遍历后需及时更新边界;
- 防止重复访问或越界。
这种思路是矩阵模拟类题型典型的"层层收缩"模型,掌握后可以轻松应用于类似题目(如「螺旋矩阵 II」生成题)。