1.1 题目:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
1.2 实例:
示例1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例2:
输入:n = 1
输出:[[1]]
1.3 提示:
1 <= n <= 20
2.解题思路
-
初始化变量:
loop
用于控制循环次数,初始值为0。- 创建一个
n x
n
的二维数组res
用于存储生成的螺旋矩阵。 startx
和starty
用于表示每次循环的起始点的横坐标和纵坐标,初始值都为0,表示从矩阵的左上角开始填充。count
用于定义填充数字,初始值为1,表示从数字1开始填充。i
和j
用于在循环中迭代行和列的索引。
-
使用
while
循环,循环的条件是loop++ < n / 2
,这是为了确保在生成完整的螺旋矩阵后退出循环。loop
从0开始,每次循环后递增1,因此实际上进行了(n/2)
次循环。 -
在循环内部,模拟填充四个边界的过程:
- 模拟上侧从左到右:从
(startx, starty)
开始,从左到右填充数字,并逐渐增加j
。这部分使用了for
循环。 - 模拟右侧从上到下:从上一步结束的位置,从上到下填充数字,并逐渐增加
i
。 - 模拟下侧从右到左:从上一步结束的位置,从右到左填充数字,并逐渐减小
j
。 - 模拟左侧从下到上:从上一步结束的位置,从下到上填充数字,并逐渐减小
i
。
- 模拟上侧从左到右:从
-
每完成一圈的填充,递增
startx
和starty
,同时递增loop
,以进入下一圈的填充。 -
如果
n
是奇数,最后一个数字可能没有被填充,因此在循环结束后,检查n
是否为奇数,如果是,将最中心位置的数字填充为count
。 -
返回生成的螺旋矩阵
res
。
3.代码
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0; // 控制循环次数
int[][] res = new int[n][n];
int startx = 0; // 每次循环的开始点(startx, starty)
int starty = 0; // 每次循环的开始点(startx, starty)
int count = 1; // 定义填充数字
int i, j;
while (loop++ < n / 2) { // 判断边界后,loop从1开始
// 模拟上侧从左到右y
for (j = starty; j < n - loop; j++) {
res[starty][j] = count++;
}
// 模拟右侧从上到下y
for (i = startx; i < n - loop; i++) {
res[i][j] = count++;
}
// 模拟下侧从右到左
for (; j >= loop; j--) {
res[i][j] = count++;
}
// 模拟左侧从下到上
for (; i >= loop; i--) {
res[i][j] = count++;
}
startx++;
starty++;
}
//如果n是奇数
if (n % 2 == 1) {
res[startx][starty] = count;
}
return res;
}
}
4.结尾
希望大家喜欢这个算法题解!如果您觉得这篇文章对您有帮助,不妨给我点个赞,这将是对我最大的鼓励。如果您有任何问题、建议或想法,请随时在评论区留言,我将竭诚为您解答。感谢您的阅读!