题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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
解题思路
此题的关键是正确变换方向,变换方向的时机是走到了数组边界,或者是走到了已遍历的位置,所以需要记录已遍历的位置;由于变换方向的过程是循环的,周期是4,所以可以用一个自增数字对4的余数表示方向
代码实现
class Solution {
int index;
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> r = new ArrayList<>();
dfs21(matrix, r, 0, 0);
return r;
}
private void dfs21(int[][] matrix, List<Integer> r, int x, int y) {
if (illeagalindex(x, y, matrix.length, matrix[0].length)
|| matrix[x][y] == 101 || r.size() >= matrix.length * matrix[0].length) return;
int direction = index % 4;
switch (direction) {
case 0: // 向右
if (y == matrix[0].length - 1 || matrix[x][y + 1] == 101) {
r.add(matrix[x][y]);
index++;
matrix[x][y] = 101;
dfs21(matrix, r, x + 1, y);
} else {
r.add(matrix[x][y]);
matrix[x][y] = 101;
dfs21(matrix, r, x, y + 1);
}
break;
case 1:
if (x == matrix.length - 1 || matrix[x + 1][y] == 101) {
r.add(matrix[x][y]);
index++;
matrix[x][y] = 101;
dfs21(matrix, r, x, y - 1);
} else {
r.add(matrix[x][y]);
matrix[x][y] = 101;
dfs21(matrix, r, x + 1, y);
}
break;
case 2:
if (y == 0 || matrix[x][y - 1] == 101) {
r.add(matrix[x][y]);
index++;
matrix[x][y] = 101;
dfs21(matrix, r, x - 1, y);
} else {
r.add(matrix[x][y]);
matrix[x][y] = 101;
dfs21(matrix, r, x, y - 1);
}
break;
case 3:
if (x == 0 || matrix[x - 1][y] == 101) {
r.add(matrix[x][y]);
index++;
matrix[x][y] = 101;
dfs21(matrix, r, x, y + 1);
} else {
r.add(matrix[x][y]);
matrix[x][y] = 101;
dfs21(matrix, r, x - 1, y);
}
break;
}
}
private boolean illeagalindex(int x, int y, int lengthX, int lengthY) {
return x < 0 || y < 0 || x >= lengthX || y >= lengthY;
}
}