题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
一定要用数组记录已打印元素,防止在最小圈的时候元素被重新打印
class Solution {
int[] result;
boolean[][] flag;
int k=0;
int m;
int n;
public int[] spiralOrder(int[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0].length==0)
return new int[0];
m=matrix.length;
n=matrix[0].length;
result=new int[m*n];
flag=new boolean[m][n];
printNum(0,0,m-1,n-1,matrix);
return result;
}
public void printNum(int x1,int y1,int x2,int y2,int[][] matrix)
{
if(k>=m*n)
return;
if(x1>x2||y1>y2)
return;
for(int i=y1;i<=y2;i++)
{
if(flag[x1][i]==false) //先判断再打印
{
result[k++]=matrix[x1][i];
flag[x1][i]=true;
}
}
for(int i=x1+1;i<=x2;i++)
{
if(flag[i][y2]==false)
{
result[k++]=matrix[i][y2];
flag[i][y2]=true;
}
}
for(int i=y2-1;i>=y1;i--)
{
if(flag[x2][i]==false)
{
result[k++]=matrix[x2][i];
flag[x2][i]=true;
}
}
for(int i=x2-1;i>x1;i--)
{
if(flag[i][y1]==false)
{
result[k++]=matrix[i][y1];
flag[i][y1]=true;
}
}
printNum(x1+1,y1+1,x2-1,y2-1,matrix);
}
}