思路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;
}