题解 | #螺旋矩阵#

螺旋矩阵

https://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        //对每一条采取左闭右开的遍历方法

        vector<int> res;
        int m=matrix.size();
        if(m==0)
        {
            return res;
        }
        int n=matrix[0].size();
        if(n==0)
        {
            return res;
        }
        int count=m*n;

        int i=0,j=0;//(i,j)对应矩阵中的一个元素
        int offset=1;//因为是左开右闭上因此offset初始设置为1,同时offset也表示转的圈数



        while(res.size()!=count)//未收集完成时循环
        {

            for(;j<n-offset;++j)//从左到右收集
                res.push_back(matrix[i][j]);

            for(;i<m-offset;++i)//从上到下收集
                res.push_back(matrix[i][j]);
            
            if(i!=offset-1)//如果说当前圈的第一行,说明本圈只有一行,剩下一个元素,直接收集
            {
                for(;j>offset-1;--j)//从右到左收集
                    res.push_back(matrix[i][j]);
            }
            else //直接收集一个元素
            {
                res.push_back(matrix[i][j]);
                    break;
            }


            if(j!=n-offset)//如果说从右到左收集后,j还在本圈右边,说明本圈只有一列,还剩下一个元素,直接收集
            {
                for(;i>offset-1;--i)
                    res.push_back(matrix[i][j]);//从下到上收集
            }
            else//直接收集一个元素
            {
                res.push_back(matrix[i][j]);
                    break;
            }

            ++offset;//下一圈
            j=offset-1;//起始位置改变
            i=offset-1;
        }
        return res;
    }
};

此题要先确定左开右闭方式,并且要注意特殊情况分类,其实就是只有一列或者只有一行的情况,如果不排除这些情况,可能会出现收集不到死循环,或者重复收集的问题

全部评论

相关推荐

Wy_m:只要不是能叫的上名的公司 去实习没有任何意义 不如好好沉淀自己
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务