方法:按层模拟 从左上方开始以顺时针的顺序遍历所有元素,假设当前层左上角坐标是 (r1, c1),右下角坐标是 (r2, c2)。
首先,遍历上方的所有元素 (r1, c),按照 c = c1,…,c2 的顺序。然后遍历右侧的所有元素 (r, c2),按照 r = r1+1,…,r2 的顺序。如果这一层有四条边(也就是 r1 < r2 并且 c1 < c2 ),我们以下图所示的方式遍历下方的元素和左侧的元素。
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List ans = new ArrayList(); if(matrix.length == 0) return ans; int r1 = 0, r2 = matrix.length - 1; int c1 = 0, c2 = matrix[0].length - 1; while(r1 <= r2 && c1 <= c2){ for(int c = c1; c <= c2; c++) ans.add(matrix[r1][c]); for(int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]); if(r1 < r2 && c1 < c2){ for(int c = c2 - 1; c >= c1 + 1; c--) ans.add(matrix[r2][c]); for(int r = r2; r >= r1 + 1; r--) ans.add(matrix[r][c1]); } r1++; r2--; c1++; c2--; } return ans; } }