【LeetCode】54. 螺旋矩阵
1 题目描述
54. 螺旋矩阵要求给定一个 m
行 n
列的矩阵 matrix
,请按照顺时针螺旋顺序返回矩阵中的所有元素。
2 解题思路
本题可以通过模拟的方式解决。我们可以通过迭代的方式来构建螺旋顺序的数组。对于每个循环,我们首先确定起始行和列,然后依次读取每一层的四个边(上、右、下、左)。每完成一层,我们更新起始行和列,并进入下一层,直到所有元素都被正确读取。
3 Java 代码实现
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
// 初始化起始位置和偏移量
int startX = 0;
int startY = 0;
int offset = 1;
int loop = 1;
// 获取矩阵的长和宽
int x = matrix.length;
int y = matrix[0].length;
// 创建结果列表
List<Integer> ans = new ArrayList<Integer>();
// 计算需要遍历的圈数
while (loop <= Math.min(x, y) / 2) {
// 向右遍历
for (int j = startY; j < y - offset; j++) {
ans.add(matrix[startX][j]);
}
// 向下遍历
for (int i = startX; i < x - offset; i++) {
ans.add(matrix[i][y - offset]);
}
// 向左遍历
for (; j > startY; j--) {
ans.add(matrix[x - offset][j]);
}
// 向上遍历
for (; i > startX; i--) {
ans.add(matrix[i][startY]);
}
// 更新起始位置和偏移量
startX++;
startY++;
offset++;
loop++;
}
// 处理特殊情况:当矩阵剩余部分为单行或单列时
if (ans.size() < x * y) {
if (x >= y) {
for (int i = startX; i <= x - offset; i++) {
ans.add(matrix[i][startY]);
}
} else {
for (int j = startY; j <= y - offset; j++) {
ans.add(matrix[startX][j]);
}
}
}
// 返回结果
return ans;
}
}
- 时间复杂度: O(n^2),因为每个元素都被放置一次。
- 空间复杂度: O(n^2),用于存储结果矩阵。
4 注意事项
- 边界条件处理:当矩阵的行数或列数为奇数时,需要特别处理中心点或剩余边的填充。
- 循环次数:循环的次数是
min(x, y) / 2
,因为每次循环都会处理外圈的一层。 - 更新偏移量:随着循环的进行,需要不断更新偏移量
offset
和起始点startX
,startY
。