LeetCode-54-螺旋矩阵

题目

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

img
1
2
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

img
1
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

题解

这题先抽象出四个边界左:l、右:r、上:t、下:b,然后当遇到上边界时,我们从左到右打印;遇到右边界时,从上到下打印;遇到下边界从右向左打印;遇到左边界从下往上打印;

同时要注意边界向内收缩,也就是处理完一个边界就“扔掉”一个边界;

每个边界遍历完成都有可能结束掉循环,此时需要判断,左边界是否大于右边界、右边界是否大于左边界、上边界是否大于下边界、下边界是否大于上边界,如果出现边界越界的情况就跳出循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
}
}

LeetCode-54-螺旋矩阵
https://excelius.xyz/leetcode-54-螺旋矩阵/
作者
Ther
发布于
2024年7月6日
许可协议