给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
写到这里思索到一种很有趣的做法,记录当前螺旋的方向和之前各个方向曾走过的次数,得出下一步应该走哪里,分享一下
public List spiralOrder(int[][] matrix) {
List list = new ArrayList();
if(matrix.length==0)
return list;
// 记录当前方向,0,1,2,3表示向右,向下,向左,向上
int direction = 0;
// 记录每个方向前进次数.0,1,2,3记录右,下,左,上
int[] counter = new int[4];
loop(list, matrix, direction, counter, 0, 0);
return list;
}
private void loop(List list, int[][] matrix, int direction, int[] counter, int i, int j) {
list.add(matrix[i][j]);
// 螺旋完毕
if (list.size() == matrix.length * matrix[0].length) {
return;
}
// 先检测当前方向,再查看是否需要转向
switch (direction) {
// 向右
case 0:
// 需要转向了
if (j + 1 + counter[1] == matrix[0].length) {
counter[0] += 1;
direction = 1;
loop(list, matrix, direction, counter, i + 1, j);
return;
}
// 不需要转向
loop(list, matrix, direction, counter, i, j + 1);
break;
// 向下
case 1:
// 需要转向了
if (i + 1 + counter[2] == matrix.length) {
counter[1] += 1;
direction = 2;
loop(list, matrix, direction, counter, i, j - 1);
return;
}
// 不需要转向
loop(list, matrix, direction, counter, i + 1, j);
break;
// 向左
case 2:
// 需要转向了
if (j == counter[3]) {
counter[2] += 1;
direction = 3;
loop(list, matrix, direction, counter, i - 1, j);
return;
}
// 不需要转向
loop(list, matrix, direction, counter, i, j - 1);
break;
// 向上
case 3:
// 需要转向了
if (i==counter[0]) {
counter[3] += 1;
direction = 0;
loop(list, matrix, direction, counter, i, j + 1);
return;
}
// 不需要转向
loop(list, matrix, direction, counter, i - 1, j);
break;
}
}
很有意思,感觉这样的做法很好玩