Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
该问题不难,关键是理清楚思路,将人脑的思考转化为机器认可的逻辑。是大脑思考的思路是,绕着矩阵边一圈一圈填数字就行,转化为逻辑即:
1、从左上角开始向右填数字->列坐标+1;
2、行坐标 +1,到头顺时针拐弯儿->遇到列坐标上限边界,上限边界-1;
3、列坐标 +1,到头顺时针拐弯儿->遇到行坐标上限边界,上限边界-1;
4、行坐标 +1,到头顺时针拐弯儿->遇到列坐标下限边界,下限边界+1;
5、列坐标 +1,到头顺时针拐弯儿->遇到行坐标下限边界,下限边界+1;
从以上分析可看到,只需理清横坐标、纵坐标、横坐标纵坐标边界跳转关系即可。
public class Solution {
public int[][] generateMatrix(int n) {
int[][] getMatrix = new int[n][n];
int x = 0; // line Coordinate
int y = 0; // row Coordinate
int LEFT = 2;
int DOWN = 1;
int RIGHT = 0;
int UP = 3;
int direct = 0; // 0 for right; 1 for down; 2 for left; 3 for up
int xDownBoundary = n - 1;
int xUpBoundary = 1;
int yLeftBoundary = 0;
int yRightBoundary = n - 1;
for (int i = 1; i <= n * n; i++) {
switch (direct) {
case 0: // right
getMatrix[x][y] = i;
if ((y + 1) > yRightBoundary) {
yRightBoundary--;
direct = DOWN;
x++;
}else{
y++;
}
break;
case 1: // down
getMatrix[x][y] = i;
if ((x + 1) > xDownBoundary) {
xDownBoundary--;
direct = LEFT;
y--;
}else{
x++;
}
break;
case 2: // left
getMatrix[x][y] = i;
if ((y - 1) < yLeftBoundary) {
yLeftBoundary++;
direct = UP;
x--;
}else{
y--;
}
break;
case 3: // up
getMatrix[x][y] = i;
if ((x - 1) < xUpBoundary) {
xUpBoundary++;
direct = RIGHT;
y++;
}else{
x--;
}
break;
default:
break;
}
}
return getMatrix;
}
}