题目描述:
给你一个 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]
思路:
参照leetcode krahets的思路,根据示例的输出方式看,顺时针打印矩阵的顺序是“从左向右、从上向下、从右向左、从上向下”依次循环。
因此,可以设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。

步骤:
1、空值处理:当matrix为空时,直接返回空列表即可。
2、初始化:矩阵左、右、上、下四个边界为l、r、t、b,l,l和t为起点坐标0,r和b分别为初始矩阵的列数-1和行数-1,相当于下标,以及用于打印结果列表res。
3、判断边界是否相遇(是否打印完毕),若打印完毕则跳出。
4、返回结果res
| 打印方向 | 1.根据边界打印 | 2.边界向内收缩 | 3.是否打印完毕 |
|---|---|---|---|
| 从左向右 | 左边界l,右边界r | 上边界t加1 相当于上边一行打印完就去掉 | 是否t>b,表示上下边界重合 |
| 从上向下 | 上边界t,下边界b | 右边界r减1 相当于右边一列打印完就去掉 | 是否l>r,表示左右边界重合 |
| 从右向左 | 右边界r,左边界l | 下边界b减1 相当于下边一行打印完去掉 | 是否t>b,表示上下边界重合 |
| 从下向上 | 下边界b,上边界t | 左边界l加1,相当于左边列打印完去掉 | 是否l>r,表示左右边界重合 |
python:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:
return []
l, r, t, b = 0, len(matrix[0]) - 1, 0, len(matrix) - 1
res = []
while True:
for i in range(l, r + 1):
res.append(matrix[t][i]) # left to right
t += 1
if t > b:
break
for i in range(t, b + 1):
res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r:
break
for i in range(r, l - 1, -1):
res.append(matrix[b][i]) # right to left
b -= 1
if t > b:
break
for i in range(b, t - 1, -1):
res.append(matrix[i][l]) # bottom to top
l += 1
if l > r:
break
return res
结果:
java:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if (matrix.length == 0)
return new ArrayList<Integer>();
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
Integer[] res = new Integer[(r + 1) * (b + 1)];
while (true) {
for (int i = l; i <= r; i++) res[x++] = matrix[t][i]; // left to right
if (++t > b) break;
for (int i = t; i <= b; i++) res[x++] = matrix[i][r]; // top to bottom
if (l > --r) break;
for (int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left
if (t >--b) break;
for (int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top
if (++l > r) break;
}
return Arrays.asList(res);
}
}
5256

被折叠的 条评论
为什么被折叠?



