T59. Spiral Matrix II【Medium】
题目
给一个整数 n,构造一个 1~n² 的螺旋排序的正方形矩阵。
例如:
当 n = 3 时,
应该返回如下矩阵:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
这题和 leetcode 第 54 题解决方法几乎一样。
(在我的 每天一题LeetCode【第39天】 有对第 54 题的分析)
接下来说本题思路,首先还是拿出这张丑图 (*  ̄∇ ̄*):
画圈圈时有三个要点:
① 画完一行(列),下次再到这行(列)时会画它的内圈
② 当画到最后,两线不能相交(就是下面的 boundriesCrossed 的作用)
③ 每画一个点都是前面的点的数字 + 1
代码
代码取自 Top Solution,稍作注释
public int[][] generateMatrix(int n) {
// 简历一个 n × n 的矩阵
int[][] matrix = new int[n][n];
// 若为 0 则直接返回
if (n == 0) {
return matrix;
}
// 设置初始值
int rowStart = 0;
int rowEnd = n-1;
int colStart = 0;
int colEnd = n-1;
int num = 1; //change
//看有没有越界,有的话循环结束
while (rowStart <= rowEnd && colStart <= colEnd) {
// 画上面的那行
for (int i = colStart; i <= colEnd; i ++) {
matrix[rowStart][i] = num ++; //change
}
//下一次内行
rowStart ++;
// 画最右边的列
for (int i = rowStart; i <= rowEnd; i ++) {
matrix[i][colEnd] = num ++; //change
}
//下一次内列
colEnd --;
// 画最下边的列
for (int i = colEnd; i >= colStart; i --) {
if (rowStart <= rowEnd)
matrix[rowEnd][i] = num ++; //change
}
//下一次内行
rowEnd --;
// 画最左边的列
for (int i = rowEnd; i >= rowStart; i --) {
if (colStart <= colEnd)
matrix[i][colStart] = num ++; //change
}
//下一次内列
colStart ++;
}
return matrix;
}