publicclassSolution {publicList<Integer> spiralOrder(int[][] matrix) {List<Integer> rst =newArrayList<Integer>();if (matrix ==null||matrix.length==0) {return rst; }int m =matrix.length;int n = matrix[0].length;int x =0, y =0;while (m >0&& n >0) {if (m ==1) {for (int i =0; i < n; i++) {rst.add(matrix[x][y++]); }break; } elseif (n ==1) {for (int i =0; i < m; i++) {rst.add(matrix[x++][y]); }break; }// top left to rightfor (int i =0; i < n -1; i++) {rst.add(matrix[x][y++]); }// to bottomfor (int i =0; i < m -1; i++) {rst.add(matrix[x++][y]); }// to leftfor (int i =0; i < n -1; i++) {rst.add(matrix[x][y--]); }// to topfor (int i =0; i < m -1; i++) {rst.add(matrix[x--][y]); }// next cycle x++; y++; m -=2; n -=2; }return rst; }}
易错点
进入 next cycle 的时候,x++
因为上一步的时候,rst.add(matrix[x--][y]);,x 多退了一步,现在要退回来。
考虑 m 和 n 为 1 的情况。
m 和 n 的 step 是 2, 因为走完一圈以后,左右两边各有一个元素占据,新的 boundary 少了 2