思路1 模拟
绘制螺旋轨迹路径,我们发现当路径超出界限或者进入之前访问过的单元格时,会顺时针旋转方向。

public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res = new ArrayList<>();if(matrix.length==0) return res;int R = matrix.length,C=matrix[0].length;//定义行数和列数boolean[][] seen = new boolean[R][C];int[] dr = {0,1,0,-1}; //定义下一次旋转的方向int[] dc = {1,0,-1,0};int r=0,c=0,di=0;for(int i=0;i<R*C;i++){res.add(matrix[r][c]);seen[r][c]=true; //标记为已经访问过int cr = r + dr[di]; //计算下一次的坐标int cc = c + dc[di];//如果下一个元素在范围内且没被访问过则更新指针if(0<=cr&&cr<R&&0<=cc&&cc<C&&!seen[cr][cc]){r = cr;c = cc;//否则顺时针旋转指针}else{di=(di+1)%4;r +=dr[di];c +=dc[di];}}return res;}
