题目
代码
中等
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
提示:
1 <= n <= 20
思路和解题方法
- 定义一个名为
Solution
的类,并在该类中实现一个名为generateMatrix
的函数。这个函数接受一个整数参数n
,表示要生成的矩阵的大小。- 声明变量
s
,size
,num
,toward
,x
和y
,并分别赋初始值为n
,n
,0,0,-1 和 0。- 创建一个二维向量
matrix
,大小为n
xn
,并初始化所有元素为0。这个二维向量将用于存储生成的矩阵。- 使用两层嵌套的循环进行螺旋遍历。 外层循环控制步数,内层循环根据当前步数
s
进行移动并填充数字。- 在外层循环中,如果步数
s
是奇数,将size
减一。这是因为在每次遍历完四个方向后,下一次遍历的步数会减少。- 在内层循环中,使用
toward
变量来确定移动的方向。根据toward
的值,更新x
和y
的坐标。- 将
num
的值加一,并将其赋给对应位置的matrix[y][x]
元素。- 内层循环结束后,通过将
toward
的值增加 1 并取模4,来实现方向切换。这样可以确保下一次移动的方向是正确的。- 当
num
的值达到size*size
时,即填充完所有数字,退出循环。- 返回生成的矩阵
matrix
。
复杂度
时间复杂度:
O(n^2)
时间复杂度为 O(n^2),其中 n 是矩阵的大小。这是因为代码使用两层循环来填充矩阵中的所有元素,内层循环执行的次数为 n^2。
空间复杂度
O(n^2)
空间复杂度为 O(n^2),这是因为需要创建一个大小为 n x n 的二维向量
matrix
来存储生成的矩阵。无论输入的大小是多少,空间复杂度都会随着输入规模的增加而线性增长。
c++ 代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
// 初始化变量:s表示剩余步数,size表示当前遍历的边长,num表示填充数字,toward表示移动方向(0:向右,1:向下,2:向左,3:向上),x和y表示当前坐标
int s = n, size = n, num = 0, toward = 0, x = -1, y = 0;
// 创建二维向量来存储生成的矩阵,初始化为全零
vector<vector<int>> matrix(n, vector<int>(n, 0));
// 螺旋遍历填充矩阵
for (int i = 0; i < n * n;) {
// 如果步数是奇数,减少尺寸
if (s % 2 == 1) {
size--;
} // 根据当前方向进行移动并填充数字
for (int j = 0; j < size; j++) {
// 更新坐标
if (toward == 0) x++; // 向右移动
else if (toward == 1) y++; // 向下移动
else if (toward == 2) x--; // 向左移动
else y--; // 向上移动
// 填充数字并递增计数器
matrix[y][x] = ++num;
i++;
}
// 切换方向
toward = (toward + 1) % 4;
// 减小步数
s--;
}
// 返回生成的矩阵
return matrix;
}
};
vs c++ 运行代码
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。