题目:54.螺旋矩阵
给你一个m
行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.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
思路
- 初始化变量:
top
表示上边界,初始化为0
。bottom
表示下边界,初始化为matrix.length - 1
。left
表示左边界,初始化为0
。- right 表示右边界,初始化为
matrix[0].length - 1
。 total
表示矩阵中的总元素数量。
- 螺旋遍历:
- 使用
while (total > 0)
循环控制遍历,当添加到结果列表中的元素数量达到总元素数量时结束遍历。 - 从左到右遍历顶边,并将元素添加到结果列表中,同时
total-1
。 - 从上到下遍历右边,并将元素添加到结果列表中,同时
total-1
。 - 从右到左遍历底边,并将元素添加到结果列表中,同时
total-1
。 - 从下到上遍历左边,并将元素添加到结果列表中,同时
total-1
。
- 使用
- 返回结果:
- 返回包含所有按螺旋顺序遍历的元素的列表。
- 时间复杂度:O(mn)
- 空间复杂度:O(mn)
代码
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new LinkedList<>();
int left = 0;
int right = matrix[0].length - 1;
int top = 0;
int bottom = matrix.length - 1;
// 矩阵中的总元素数量
int total = matrix[0].length * matrix.length;
while (total > 0) {
// 从左到右遍历顶边
for (int i = left; i <= right && total > 0; i++) {
result.add(matrix[top][i]);
total--;
}
// 向下移动顶边界
top++;
// 从上到下遍历右边
for (int i = top; i <= bottom && total > 0; i++) {
result.add(matrix[i][right]);
total--;
}
// 向左移动右边界
right--;
// 从右到左遍历底边
for (int i = right; i >= left && total > 0; i--) {
result.add(matrix[bottom][i]);
total--;
}
// 向上移动底边界
bottom--;
// 从下到上遍历左边
for (int i = bottom; i >= top && total > 0; i--) {
result.add(matrix[i][left]);
total--;
}
// 向右移动左边界
left++;
}
return result;
}