注意按照顺时针方向进行访问元素,以及每次触发的条件只会满足一个!
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和colint 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;}