思路
通过top、bottom、left、right四个变量来控制矩阵的边界,每次打印完便更新矩阵的边界,边界外的都是已经打印好的。这样,每次打印便可以分解为四个动作:
- print(m[top][left->right]), top++
- print(m[top->bottom][right]),right–
- print(m[bottom][right->left]),bottom–
- print(m[bottom->top][left]),left++
注意,每个动作结束后都要对边界进行更新。
代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
int rows=matrix.length;
if(rows==0) return new int[0];
int cols=matrix[0].length;
if(cols==0) return new int[0];
int re[]=new int[cols*rows];
sub(re,0,0,0,rows-1,0,cols-1,matrix);
return re;
}
void sub(int[] re,int index,int indicator,int top,int bottom,int left,int right,int[][] m){
if(top>bottom||left>right) return;
if(indicator==0){
for(int i=index;i<=index+right-left;i++){
re[i]=m[top][left+i-index];
}
sub(re,index+right-left+1,1,top+1,bottom,left,right,m);
}else if(indicator==1){
for(int i=index;i<=index+bottom-top;i++){
re[i]=m[top+i-index][right];
}
sub(re,index+bottom-top+1,2,top,bottom,left,right-1,m);
}else if(indicator==2){
for(int i=index;i<=index+right-left;i++){
re[i]=m[bottom][right+index-i];
}
sub(re,index+right-left+1,3,top,bottom-1,left,right,m);
}else{
for(int i=index;i<=index+bottom-top;i++){
re[i]=m[bottom+index-i][left];
}
sub(re,index+bottom-top+1,0,top,bottom,left+1,right,m);
}
}
}