题目:
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]
.
思路:
该题属于模拟题,意图在于对二维数组的操作控制。
首先定义方向,并定义边界。对于题目中的例子,每个方向的运动情况如下图:
按此顺序进行添加。注意:1、m可能会不等于n;
2、m=n时,有两种可能,分奇数和偶数,奇数的时候,需要留意中间那个最后的数字跟运动方向上边界的关系。
AC代码:
public List<Integer> spiralOrder(int[][] matrix) { int curDir = 0; List<Integer> rst = new LinkedList<Integer>(); if(matrix==null || matrix.length==0) return rst; int m = matrix.length; int n = matrix[0].length; int totalNum = m*n; if(m<=1){ for(int j = 0;j<n;j++) rst.add(matrix[0][j]); return rst; } else if(n<=1){ for (int[] aMatrix : matrix) { rst.add(aMatrix[0]); } return rst; } int[] fourConer = new int[4]; fourConer[0] = n-1; fourConer[1] = m-1; fourConer[2] = 0; fourConer[3] = 0; int count = 0; int i; int beginx = 0; int beginy = 0; while(count<totalNum){ if(curDir==0){ if(beginx==beginy && count==totalNum-1){ rst.add(matrix[beginx][beginy]); break; } for(i=beginy;i<fourConer[curDir];i++){ rst.add(matrix[beginx][i]); count++; } beginy = i; fourConer[curDir] = i-1; } if(curDir==1){ for(i=beginx;i<fourConer[curDir];i++){ rst.add(matrix[i][beginy]); count++; } beginx = i; fourConer[curDir] = i-1; } if(curDir==2){ for(i=beginy;i>fourConer[curDir];i--){ rst.add(matrix[beginx][i]); count++; } beginy = i; fourConer[curDir] = i+1; } if(curDir==3){ for(i=beginx;i>fourConer[curDir];i--){ rst.add(matrix[i][beginy]); count++; } beginx = i+1; beginy++; fourConer[curDir] = i+1; } curDir = (curDir+1)%4; } return rst; }