2023.2.15螺旋矩阵(54)和螺旋矩阵II(59)

文章介绍了如何使用C++实现螺旋矩阵的遍历(54题)和生成(59题)方法,关键在于设立并更新边界,按照右、下、左、上的顺序移动。在实现过程中,需要注意vector二维数组的初始化,避免越界问题,并正确处理边界条件。同时,文章提到了在使用vector时可能出现的错误以及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个题的解题思路完全相同,设立 上下左右 四个边界;然后沿着边界依次向右、向下、向左、向右移动,四次移动唯一次循环,每次移动后更新边界,例如,向右移动时,移动完 上边界+1(即去掉第一行),其他同理,然后判断是否与下边界相交(这里不包含相等,找个例子试试会发现出错),若相交说明完成遍历,跳出循环。

遇到的问题:

初次使用vector二维数组不熟练导致的问题:vector<vector<int> > matrix(n,vector<int>(n,0));要初始化空间,否则后面直接用matrix[on][i]会报错;右和下边界要-1,否则越界。这两个都会有这种reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)报错,查阅后发现是越界和没有预留空间;没有判读数组是否为空也会报错,但是没有遇到,以后遇到注意。

嗯还有一个push_back有下划线。

  1. 螺旋矩阵(54)
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int on=0;
        int left=0;
        int under=matrix.size()-1;
        int right=matrix[0].size()-1;
        vector<int> v;
        while(1)
        {
            for(int i=left;i<=right;i++)
            v.push_back(matrix[on][i]);
            if(++on>under)
            break;
            for(int i=on;i<=under;i++)
            v.push_back(matrix[i][right]);
            if(--right<left)
            break;
            for(int i=right;i>=left;i--)
            v.push_back(matrix[under][i]);
            if(--under<on)
            break;
            for(int i=under;i>=on;i--)
            v.push_back(matrix[i][left]);
            if(++left>right)
            break;
        }
        return v;
    }
};
2.螺旋矩阵II(59)
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int on=0;
        int left=0;
        int under=n-1;
        int right=n-1;
        vector<vector<int> > matrix(n,vector<int>(n,0));
        int m=1;
        while(1)
        {
            for(int i=left;i<=right;i++)
            {
                matrix[on][i]=m;
                m++;
            }
            if(++on>under)
            break;
            for(int i=on;i<=under;i++)
            {
                matrix[i][right]=m;
                m++;
            }
            if(--right<left)
            break;
            for(int i=right;i>=left;i--)
            {
                matrix[under][i]=m;
                m++;
            }
            if(--under<on)
            break;
            for(int i=under;i>=on;i--)
            {
                matrix[i][left]=m;
                m++;
            }
            if(++left>right)
            break;
        }
        return matrix;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值