C++算法练习-day5——59.螺旋矩阵2

题目来源:. - 力扣(LeetCode)

题目思路分析

给定一个整数 n,要求生成一个 n x n 的矩阵,其中的元素按螺旋顺序排列,从矩阵的左上角开始,向右、向下、向左、向上依次填充,直到所有元素都被填充完毕。

这个问题可以通过模拟螺旋填充的过程来解决。我们可以使用四个变量来跟踪当前要填充的边界:s(上边界),x(下边界),z(左边界),y(右边界)。初始时,这四个变量分别设置为 0、n-1、0、n-1,表示整个矩阵的范围。然后,我们按照右、下、左、上的顺序填充矩阵,每次填充完一条边后,相应地更新边界变量,直到所有元素都被填充完毕。

代码实例及注解

实例:

#include <vector>  
  
class Solution {  
public:  
    std::vector<std::vector<int>> generateMatrix(int n) {  
        // 创建一个 n x n 的矩阵,并初始化为 0  
        std::vector<std::vector<int>> ans(n, std::vector<int>(n, 0));  
          
        // 定义四个边界变量  
        int s = 0; // 上边界  
        int x = n - 1; // 下边界  
        int z = 0; // 左边界  
        int y = n - 1; // 右边界  
          
        // 当前要填充的数字,从 1 开始  
        int num = 1;  
          
        // 当还有元素未填充完毕时,继续循环  
        while (num <= n * n) {  
            // 从左到右填充上边  
            for (int i = z; i <= y; i++, num++) {  
                ans[s][i] = num;  
            }  
            s++; // 上边界下移  
              
            // 从上到下填充右边  
            for (int i = s; i <= x; i++, num++) {  
                ans[i][y] = num;  
            }  
            y--; // 右边界左移  
              
            // 注意:如果只剩下一行或一列未填充,上面的两个循环会正确地处理这种情况,  
            // 因为当 s == x 或 z == y 时,相应的循环体将不会执行任何操作。  
              
            // 从右到左填充下边(如果还有未填充的行)  
            if (s <= x) { // 检查是否还有未填充的行  
                for (int i = y; i >= z; i--, num++) {  
                    ans[x][i] = num;  
                }  
                x--; // 下边界上移  
            }  
              
            // 从下到上填充左边(如果还有未填充的列)  
            if (z <= y) { // 检查是否还有未填充的列  
                for (int i = x; i >= s; i--, num++) {  
                    ans[i][z] = num;  
                }  
                z++; // 左边界右移  
            }  
        }  
          
        return ans;  
    }  
};

注解

  • std::vector<std::vector<int>> ans(n, std::vector<int>(n, 0));:创建一个 n x n 的矩阵,并初始化为 0。
  • int s = 0, x = n - 1, z = 0, y = n - 1;:定义四个边界变量,分别表示上、下、左、右边界。
  • int num = 1;:当前要填充的数字,从 1 开始。
  • while (num <= n * n):当还有元素未填充完毕时,继续循环。
  • for (int i = z; i <= y; i++, num++) { ans[s][i] = num; }:从左到右填充上边。
  • s++;:上边界下移。
  • for (int i = s; i <= x; i++, num++) { ans[i][y] = num; }:从上到下填充右边。
  • y--;:右边界左移。
  • if (s <= x) { ... } 和 if (z <= y) { ... }:这两个条件判断是为了处理在填充过程中可能出现的只剩下一行或一列未填充的情况。
  • for (int i = y; i >= z; i--, num++) { ans[x][i] = num; }:从右到左填充下边(如果还有未填充的行)。
  • x--;:下边界上移。
  • for (int i = x; i >= s; i--, num++) { ans[i][z] = num; }:从下到上填充左边(如果还有未填充的列)。
  • z++;:左边界右移。

知识点摘要

  1. 矩阵初始化:在 C++ 中,可以使用嵌套的 std::vector 来创建二维矩阵,并通过构造函数将其初始化为特定值。

  2. 边界变量:在处理螺旋填充等问题时,使用边界变量来跟踪当前要处理的区域是一个有效的方法。

  3. 循环控制:通过合理的循环控制和条件判断,可以确保每个元素都被正确地填充到矩阵中。

  4. 算法的时间复杂度:该算法的时间复杂度为 O(n2),用于存储生成的矩阵。

通过本文的讲解和代码实例,相信读者已经对如何生成按螺旋顺序排列的矩阵有了更深入的理解。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值