题目:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.For example,
Given n = 3,
You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路1:
一层一层的计算,每一层计算四个边的数字并填入。即是求计算公式
Code:
public int[][] generateMatrix(int n) {
int[][] A=new int[n][n];
if(n==0){
return A;
}
if(n==1){
A[0][0]=1;
return A;
}
int count=0;
int layerNum=n/2;
int max=0;
for(int layer=0;layer<=layerNum;layer++){
if((n-2*layer-1)==0) max=1;
else max=(n-2*layer-1);
for(int i=0;i<max;i++){
A[layer][i+layer]=i+count+1;
A[i+layer][n-layer-1]=n-2*layer+count+i;
A[n-layer-1][n-layer-i-1]=(n-2*layer-1)*2+i+1+count;
A[n-layer-i-1][layer]=(n-2*layer-1)*3+i+1+count;
}
count+= (n-2*layer-1)*4;
}
return A;
}
思路2:
以层为概念,循环
Code:
public int[][] generateMatrix(int n) {
int startX = 0;
int startY = 0;
int endX = n - 1;
int endY = n - 1;
int[][] matrix = new int[n][n];
int startValue = 1;
while (startX <= endX) {
startValue = fillNumber(startX, startY, endX, endY, matrix, startValue);
startX++;
startY++;
endX--;
endY--;
}
return matrix;
}
public int fillNumber(int startX, int startY, int endX, int endY, int[][] matrix, int startV) {
if (startX == endX) {
matrix[startX][startY] = startV;
return -1;
}
for (int i = startY; i <= endY; i++) {
matrix[startX][i] = startV;
startV++;
}
for (int i = startX + 1; i <= endX; i++) {
matrix[i][endY] = startV;
startV++;
}
for (int i = endY - 1; i >= startY; i--) {
matrix[endX][i] = startV;
startV++;
}
for (int i = endX - 1; i >= startX + 1; i--) {
matrix[i][startY] = startV;
startV++;
}
return startV;
}
备注: