力扣第59题 螺旋矩阵II 模拟 c++注释版 简单易懂

题目

代码

59. 螺旋矩阵 II

中等

给你一个正整数 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

思路和解题方法

  1. 定义一个名为 Solution 的类,并在该类中实现一个名为 generateMatrix 的函数。这个函数接受一个整数参数 n,表示要生成的矩阵的大小。
  2. 声明变量 ssizenumtowardx 和 y,并分别赋初始值为 nn,0,0,-1 和 0。
  3. 创建一个二维向量 matrix,大小为 nxn,并初始化所有元素为0。这个二维向量将用于存储生成的矩阵。
  4. 使用两层嵌套的循环进行螺旋遍历。 外层循环控制步数,内层循环根据当前步数 s 进行移动并填充数字。
  5. 在外层循环中,如果步数 s 是奇数,将 size 减一。这是因为在每次遍历完四个方向后,下一次遍历的步数会减少。
  6. 在内层循环中,使用 toward 变量来确定移动的方向。根据 toward 的值,更新 x 和 y 的坐标。
  7. 将 num 的值加一,并将其赋给对应位置的 matrix[y][x] 元素。
  8. 内层循环结束后,通过将 toward 的值增加 1 并取模4,来实现方向切换。这样可以确保下一次移动的方向是正确的。
  9. 当 num 的值达到 size*size 时,即填充完所有数字,退出循环。
  10. 返回生成的矩阵 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++ 运行代码

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值