描述:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
思路:
这题看起来是很复杂,做起来也确实挺复杂的。但是呢,这题并不是非常非常难,只是控制逻辑让人很抓狂罢了。
colStart,colEnd,rowStart,rowEnd,num=0
1.colStart<colEnd 输出arr[row][colStart]~arr[row][colEnd-1]的值
2.rowStart<rowEnd 输出arr[col][rowStart]~ar[col][rowEnd-1]的值
3.colEnd>colStart 输出arr[rowLen-1-row][colEnd]~arr[rowLen-1-row][colStart+1]的值
4.rowEnd>rowStart 输出arr[colLen-1-col][rowEnd]~arr[colLen-1-col][rowStart+1]的值
代码:
public static List<Integer> spiralOrder(int[][] matrix) { List<Integer>list=new ArrayList<Integer>(); if(matrix==null||matrix.length==0) return list; int rows=matrix.length,cols=matrix[0].length; if(rows==1) { for(int num:matrix[0]) list.add(num); return list; }else if(matrix[0].length==1) { for(int i=0;i<rows;i++) list.add(matrix[i][0]); return list; } int x=0,y=0; while(x<cols-x&&y<rows-y) { int end=cols-x-1; if(x<end) { for(int i=x;i<end;i++) list.add(matrix[y][i]); } end=rows-y-1; if(y<end) { for(int j=y;j<end;j++) list.add(matrix[j][cols-x-1]); } int start=cols-x-1; if(start>x) { for(int i=start;i>x;i--) list.add(matrix[rows-y-1][i]); } start=rows-y-1; if(start>y) { for(int j=start;j>y;j--) list.add(matrix[j][x]); } if(2*x+1==cols&&2*y+1==rows) list.add(matrix[y][x]); x++; y++; } return list; }