image.png

思路1 模拟

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

image.png

  1. public List<Integer> spiralOrder(int[][] matrix) {
  2. List<Integer> res = new ArrayList<>();
  3. if(matrix.length==0) return res;
  4. int R = matrix.length,C=matrix[0].length;//定义行数和列数
  5. boolean[][] seen = new boolean[R][C];
  6. int[] dr = {0,1,0,-1}; //定义下一次旋转的方向
  7. int[] dc = {1,0,-1,0};
  8. int r=0,c=0,di=0;
  9. for(int i=0;i<R*C;i++){
  10. res.add(matrix[r][c]);
  11. seen[r][c]=true; //标记为已经访问过
  12. int cr = r + dr[di]; //计算下一次的坐标
  13. int cc = c + dc[di];
  14. //如果下一个元素在范围内且没被访问过则更新指针
  15. if(0<=cr&&cr<R&&0<=cc&&cc<C&&!seen[cr][cc]){
  16. r = cr;
  17. c = cc;
  18. //否则顺时针旋转指针
  19. }else{
  20. di=(di+1)%4;
  21. r +=dr[di];
  22. c +=dc[di];
  23. }
  24. }
  25. return res;
  26. }