螺旋矩阵II
描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
分析
这道题目不涉及算法,就是对整个过程进行模拟,尤其考察对于边界处理。
分析循环次数:我们假设顺时针一圈为一个循环。
- 当n为奇数时,遍历次数为n/2,此时,会有个中间元素,这个元素直接填充即可。
- 当n为偶数时,遍历次数还是n/2.此时,n/2次循环刚好填充完毕
分析起点:定义变量startX,startY.
- 初始startX=startY=0;
- 之后的每一轮循环的起始点都需要startX++,startY++.
分析步长:首先需要自己约定好规则,然后去控制步长
假设此时n为3,四个方向都遵循左闭右开的原则去依次填充。
至于步长,因为每一轮循环填充的步长都是不一样的,可以通过一个offset变量来控制。
code
public int[][] generateMatrix(int n) {
int count = 1;
int startX = 0;
int startY = 0;
int[][] matrix = new int[n][n];
int loop = n / 2;
int mid = n / 2;
int l = 0, t = 0;
int offset = 1;//限制每轮while中,for的填充个数.由于上一轮while填充了一圈,所以下一轮需要offset++
while (loop > 0) {
for (l = startX; l < n - offset; l++) {//从左到右
matrix[startX][l] = count++;
}
for (t = startY; t < n - offset; t++) {//从上到下
matrix[t][l] = count++;
}
for (; l > startX; l--) {//从右到左
matrix[t][l] = count++;
}
for (; t > startY; t--) {//从下到上
matrix[t][l] = count++;
}
offset++;
startX++;
startY++;
loop--;
}
if (n % 2 == 1) {//奇数的情况下,直接填充中间元素即可。
matrix[mid][mid] = count++;
}
return matrix;
}