题目
给你一个 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
思路
我们可以将这个操作拆分为四个动作:从左向右、从上向下、从右向左、从下向上,之后通过循环这四个动作即可(每次循环后重新定义边界)
- 从左向右:左边界l ,右边界 r,上边界 t 加 1(遍历一次后),所有遍历完毕条件(上边界t<下边界b)
- 从上向下:上边界 t ,下边界b,右边界 r 减 1(遍历一次后),所有遍历完毕条件(左边界l>右边界r)
- 从右向左:右边界 r ,左边界l, 下边界 b 减 1(遍历一次后),所有遍历完毕条件(上边界t<下边界b)
- 从下向上:下边界 b ,上边界t, 左边界 l 加 1(遍历一次后),所有遍历完毕条件(左边界l>右边界r)
参考这个题解
以后关于螺旋的问题,都可以使用这种方式去拆分求解
代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res;
if (matrix.length == 0) {
return new ArrayList<>();
}
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1;
int index = 0;
Integer[] ans = new Integer[(r + 1) * (b + 1)];
while (true) {
for (int i = l; i <= r; i++) {
ans[index++] = matrix[t][i];
}
if (++t > b)
break;
for (int i = t; i <= b; i++) {
ans[index++] = matrix[i][r];
}
if (--r < l)
break;
for (int i = r; i >= l; i--) {
ans[index++] = matrix[b][i];
}
if (--b < t)
break;
for (int i = b; i >= t; i--) {
ans[index++] = matrix[i][l];
}
if (++l > r)
break;
}
return Arrays.asList(ans);
}
}