LeetCode 第54题:螺旋矩阵
题目描述
给你一个 m x n 的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
难度
中等
题目链接
示例
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
解题思路
边界模拟法
这道题的关键是按照螺旋顺序遍历矩阵,我们可以通过维护四个边界,按照右、下、左、上的顺序遍历。
关键点:
- 维护四个边界:上、下、左、右
- 按照固定顺序遍历:右→下→左→上
- 每遍历完一个方向,更新对应的边界
- 注意处理单行或单列的特殊情况
具体步骤:
- 初始化边界值和结果列表
- 当还有元素未遍历时:
- 从左到右遍历上边界
- 从上到下遍历右边界
- 从右到左遍历下边界(如果还有行)
- 从下到上遍历左边界(如果还有列)
- 返回结果列表
图解思路
算法步骤分析表
| 步骤 | 方向 | 边界更新 | 遍历元素 | 说明 |
|---|---|---|---|---|
| 初始 | - | top=0,bottom=2,left=0,right=2 | [] | 开始状态 |
| 第1步 | 右 | top++ | [1,2,3] | 遍历上边界 |
| 第2步 | 下 | right-- | [1,2,3,6,9] | 遍历右边界 |
| 第3步 | 左 | bottom-- | [1,2,3,6,9,8,7] | 遍历下边界 |
| 第4步 | 上 | left++ | [1,2,3,6,9,8,7,4,5] | 遍历左边界 |
状态/情况分析表
| 情况 | 输入 | 输出 | 说明 |
|---|---|---|---|
| 1×1矩阵 | [[1]] | [1] | 最简单情况 |
| 1×n矩阵 | [[1,2,3]] | [1,2,3] | 单行情况 |
| m×1矩阵 | [[1],[2],[3]] | [1,2,3] | 单列情况 |
代码实现
C# 实现
public class Solution {
public IList<int> SpiralOrder(int[][] matrix) {
var result = new List<int>();
if (matrix == null || matrix.Length == 0) return result;
int top = 0;
int bottom = matrix.Length - 1;
int left = 0;
int right = matrix[0].Length - 1;
while (top <= bottom && left <= right) {
// 从左到右遍历上边界
for (int i = left; i <= right; i++) {
result.Add(matrix[top][i]);
}
top++;
// 从上到下遍历右边界
for (int i = top; i <= bottom; i++) {
result.Add(matrix[i][right]);
}
right--;
if (top <= bottom) {
// 从右到左遍历下边界
for (int i = right; i >= left; i--) {
result.Add(matrix[bottom][i]);
}
bottom--;
}
if (left <= right) {
// 从下到上遍历左边界
for (int i = bottom; i >= top; i--) {
result.Add(matrix[i][left]);
}
left++;
}
}
return result;
}
}
执行结果
- 执行用时:132 ms
- 内存消耗:40.1 MB
代码亮点
- 🎯 边界条件处理清晰
- 💡 代码结构有序,易于理解
- 🔍 优化了单行单列的处理
- 🎨 变量命名直观明确
常见错误分析
- 🚫 边界更新顺序错误
- 🚫 没有处理单行或单列情况
- 🚫 边界条件判断不当
- 🚫 遍历方向搞错
解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
|---|---|---|---|---|
| 边界模拟 | O(mn) | O(1) | 直观易懂 | 边界较多 |
| 方向数组 | O(mn) | O(1) | 代码简洁 | 不易理解 |
| 标记访问 | O(mn) | O(mn) | 思路简单 | 空间消耗大 |