[
[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]一刷我记得用的是12 36 98 74 这种方式,然后往里一层。
遇到长宽是1(比如刚才第二层就剩1个5了)和2([1,2],[3,4])的就只遍历,不往里。但是很麻烦,二刷换了个方法。。
public class Solution { public ListspiralOrder(int[][] matrix) { List res = new ArrayList (); int row = matrix.length; if(row == 0) return res; int col = matrix[0].length; if(col == 0) { for(int n = 0; n < row;n++) { res.add(matrix[n][0]); } return res; } helper(0,0,row,col,matrix,res); return res; } public void helper(int currentRow, int currentCol, int rowLeft, int colLeft, int[][] matrix, List res) { if(rowLeft == 1 && colLeft == 1) { res.add(matrix[currentRow][currentCol]); return; } else if(rowLeft == 1) { for(int n = 0; n < colLeft;n++) { res.add(matrix[currentRow][currentCol]); currentCol++; } return; } else if(colLeft == 1) { for(int m = 0; m < rowLeft;m++) { res.add(matrix[currentRow][currentCol]); currentRow++; } return; } else { } if(rowLeft < 1 || colLeft < 1) return; int tempInt; for(int m = 0; m < colLeft-1; m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentCol++; } for(int m = 0; m < rowLeft-1;m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentRow++; } for(int m = 0; m < colLeft-1; m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentCol--; } for(int m = 0; m < rowLeft-1;m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentRow--; } helper(currentRow+1,currentCol+1,rowLeft-2,colLeft-2,matrix,res); }}
二刷和一刷相比最大最大的改变是 I changed the name of method helper() to doThisShit(), which sounds more awesome.
public class Solution { public ListspiralOrder(int[][] matrix) { List res = new ArrayList (); if(matrix.length == 0) return res; /* A B C D */ int A = 0; int B = 0; int C = matrix[0].length-1; int D = matrix.length-1; doThisShit(res,matrix,A,B,C,D); return res; } public void doThisShit(List res, int[][] matrix, int A, int B, int C, int D) { while(C - B >= 0 && D - A >= 0) { for(int i = B; i <= C;i++)res.add(matrix[A][i]); A++; for(int i = A; i <= D;i++)res.add(matrix[i][C]); C--; for(int i = C; i >= B && D > A-1;i--)res.add(matrix[D][i]); D--; for(int i = D; i >= A && B < C+1;i--)res.add(matrix[i][B]); B++; } }}
[
[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]123 69 87 45 纯绕圈。
特殊情况是长和宽是否相等。
比如123456 会算2次,所以下边和左边要判断是否遍历过了。
1 2 3 4 5 6 A B C D A和D是相等的
上边(A)从1遍历到6,A++;
右边因为A+1超边界,所以不便利,C++; 下边D从6便利到1,D--;(这里反向遍历了654321) 左边因为D-1超边界,所以不遍历,D--;同理
12345
会发现B反向遍历了一次5到1.
如果采用8个变量来记录位置,分别记录四个角的X和Y,就没这个问题了,但是这里只用4个,后2个循环需要多加一层判断。