image.png

解决思路

模拟

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

  1. public List<Integer> spiralOrder(int[][] matrix){
  2. List ans = new ArrayList();
  3. if(matrix.length == 0) return ans;
  4. int R = matrix.length,C =matrix[0].length;
  5. boolean[][] seen = new boolean[R][C];
  6. int[][] d = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
  7. int r = 0,c =0,di = 0;
  8. for(int i =0;i<R*C;i++){
  9. ans.add(matrix[r][c]);
  10. seen[r][c] = true;
  11. int cr = r + d[di][0];
  12. int cc = c + d[di][1];
  13. if(0<=cr && cr<R && 0<=cc && cc<C &&!seen[cr][cc]){
  14. r = cr;
  15. c = cc;
  16. }else{
  17. di = (di+1)%4;
  18. r += d[di][0];
  19. c += d[di][1];
  20. }
  21. }
  22. return ans;
  23. }