数组的螺旋输出,重点在于每次输出一个口 一层一层的
代码:
//每次输出一个口
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result=new ArrayList<Integer>();
if(null==matrix||matrix.length==0)
return result;
int n=matrix.length;
int m=matrix[0].length;
int i=0; //上
int j=m-1; //左
int k=n-1; //下
int l=0; //右
if(n==1){
for(int index=0;index<m;index++)
result.add(new Integer(matrix[0][index]));
return result;
}
if(m==1){
for(int index=0;index<n;index++)
result.add(new Integer(matrix[index][0]));
return result;
}
while(i<k&&l<j){
for(int up=l;up<=j;up++)
result.add(new Integer(matrix[i][up]));
for(int left=i+1;left<k;left++)
result.add(new Integer(matrix[left][j]));
for(int down=j;down>=l;down--)
result.add(new Integer(matrix[k][down]));
for(int right=k-1;right>i;right--)
result.add(new Integer(matrix[right][l]));
i++;
j--;
k--;
l++;
}
if(i==k)
for( int end=l;end<=j;end++)
result.add(new Integer(matrix[i][end]));
if(l==j&&i!=k)//防止中心点重复
for(int over=i;over<=k;over++)
result.add(new Integer(matrix[over][l]));
return result;
}
反过来:
public int[][] generateMatrix(int n) {
if(n<0)return null;
int matrix[][]=new int[n][n];
int num=1;
int m=n;
int i=0; //上
int j=m-1; //左
int k=n-1; //下
int l=0; //右
if(n==1){
for(int index=0;index<m;index++)
matrix[0][index]=num++;
return matrix;
}
if(m==1){
for(int index=0;index<n;index++)
matrix[index][0]=num++;
return matrix;
}
while(i<k&&l<j){
for(int up=l;up<=j;up++)
matrix[i][up]=num++;
for(int left=i+1;left<k;left++)
matrix[left][j]=num++;
for(int down=j;down>=l;down--)
matrix[k][down]=num++;
for(int right=k-1;right>i;right--)
matrix[right][l]=num++;
i++;
j--;
k--;
l++;
}
if(i==k)
for( int end=l;end<=j;end++)
matrix[i][end]=num++;
if(l==j&&i!=k)//防止中心点重复
for(int over=i;over<=k;over++)
matrix[over][l]=num++;
return matrix;
}