螺旋矩阵之一套代码过三道题目

这篇博客讲解一下如何用一套代码过三道螺旋矩阵的题目
先看第一道
54. 螺旋矩阵

首先要明确螺旋的循环方向:右下左上……,其次明确上下左右边界。明确这两点就不难做了
一次循环一个方向就填一个值,这样就不会乱了

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>re;
        int xn=matrix.size();//行数
        int yn=matrix[0].size();//列数
        int loop=xn*yn;//循环次数
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
        //边界
        int right=yn-1;
        int bottom=xn-1;
        int left=0;
        int upper=1;
        //开始位置
        int x=0;
        int y=0;
        int dir=0;//当前方向
        while(loop--){
            re.push_back(matrix[x][y]);
            if(dir==0 && y==right){//往右走到了右边界
                dir++;
                right--;

            }
            if(dir==1 && x==bottom){//往下走到了下边界
                dir++;
                bottom--;

            }
            if(dir==2 && y==left){//往左走到了左边界
                dir++;
                left++;

            }
            if(dir==3 && x==upper){//往上走到了上边界
                dir=0;
                upper++;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

59. 螺旋矩阵 II

稍微改一下边界情况就OK了

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>re(n,vector<int>(n));
        int loop=n*n;//循环次数
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
        int right=n-1;//右边界
        int bottom=n-1;//下边界
        int left=0;//左边界
        int upper=1;//上边界
        //开始位置
        int x=0;
        int y=0;
        int num=1;
        int dir=0;//0:往右走,1:往下走,2:往左走,3:往上走
        while(loop--){
            re[x][y]=num++;
            if(dir==0 && y==right){//往右走到了右边界
                dir++;
                right--;
            }
            if(dir==1 && x==bottom){//往下走到了下边界
                dir++;
                bottom--;
            }
            if(dir==2 && y==left){//往左走到了左边界
                dir++;
                left++;
            }
            if(dir==3 && x==upper){//往上走到了上边界
                dir=0;
                upper++;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

885. 螺旋矩阵 III

这道题和前两道的区别在于开始位置不是从左上角开始,而且是从内往外旋,所以也就会出现越界的情况。
大体上没有改变,这是在填值的时候先判断在界内。

class Solution {
public:
    vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
        vector<vector<int>>re;
        int t=1;
        int right=cStart+1;
        int bottom=rStart+1;
        int left=cStart-1;
        int upper=rStart-1;
        int x=rStart;
        int y=cStart;
        vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//代表右下左上四个方向
        int dir=0;//先向右走
        while(t<=rows*cols){
            if(x>=0 && x<rows && y>=0 && y<cols){
                re.push_back({x,y});
                t++;
            }
            if(dir==0 && y==right){//当前往右走,如果到达了右边界要变向
                dir++;
                right++;//右边界右移
            }
            if(dir==1 && x==bottom){
                dir++;
                bottom++;
            }
            if(dir==2 && y==left){
                dir++;
                left--;
            }
            if(dir==3 && x==upper){
                dir=0;
                upper--;
            }
            //下一个位置
            x+=around[dir].first;
            y+=around[dir].second;
        }
        return re;
    }
};

总结:这三道题目没有设计到什么算法,就是模拟的题目,做这类题目要先分析模拟的过程,分析边界情况,然后再去实操。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值