题目:
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:
每次设置矩阵的最外层的值,赋值完成后,再将矩阵里面的一层视为新的最外层,然后继续赋值。保证每次赋的值都是在递增。
说的可能不清楚,请看代码!!
代码:
//59.螺旋矩阵2
public int cur = 1;//当前值
public int[][] generateMatrix(int n) {
cur = 1;
int[][] m = new int[n][n];
for(int i =0, j=n-1 ; i<=j; i++, j--) {
// System.out.println(String.format("i是:%d, j是:%d", i,j));
setMatrixBoundaryValue(m, i, i,j, j);//设置由这两个点组成的一个矩阵的最外层的值
}
return m;
}
//设置由这两个点组成的一个矩阵的最外层的值
public void setMatrixBoundaryValue(int[][] m, int strX, int strY, int endX, int endY) {
if(strX == endX) {//最后如果只剩一个数了
m[strX][strY] = cur++;
return;
}
for(int j = strY; j<endY; j++) //注意不走到底,防止有重复数据
m[strX][j] = cur++;
for(int i = strX; i<endX; i++)
m[i][endY] = cur++;
for(int j = endY; j>strY; j--)
m[endX][j] = cur++;
for(int i = endX; i>strX; i--)
m[i][strY] = cur++;
}
用时2ms,和用时1ms的答案范例很相似,不同是赋值最外层时的具体赋值过程不同