注意按照顺时针方向进行访问元素,以及每次触发的条件只会满足一个!
public List<Integer> spiralOrder(int [][] matrix){
List<Integer> result = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int row=0,col = 0;
//每个位置是否访问过/添加过
boolean [][] visited = new boolean[m][n];
//四个方向
int [][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
for (int i = 0,di = 0; i < m * n; i++) {
result.add(matrix[row][col]);
//添加该元素之后就该设置为已访问
visited[row][col] = true;
//按照顺时针的方向设置row和col
int nextRow = row + dirs[di][0];
int nextCol = col + dirs[di][1];
//判断新的row col 是否越界 或者 该位置元素是否被访问过 注意这里最多只会触发一个不满足条件
if(nextRow < 0 || nextRow >= m || nextCol < 0
|| nextCol >= n || visited[nextRow][nextCol] == true){
//改变新的方向后,一定会满足条件
di = (di + 1) % 4;
}
//将新的 row col设置为新的值
row = row + dirs[di][0];
col = col + dirs[di][1];
}
return result;
}