16、顺时针打印矩阵

题目:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如矩阵为


输出后的结果为[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

解法:

1、求取数组的row和col ,利用循环,每次输出一个圆 来逐次输出所有数据。

初始化circleNum=0,那么每一圈开始位置为matrix[circleNum][circleNum],即第一圈开始的位置在数组中的索引。

我们可以发现规律,循环的终止条件为 col >circleNum*2  && row>circleNum*2

2、以如下四步的方式画一个完整的圈。


每一步都有运行的条件假设每一圈的最后一行的坐标为endY = row -1 - circleNum;,

每一圈最后一列的坐标为 endX = col -1 - circleNum分析可得:

    第一步一定会运行

    第二步运行的条件是endY>circleNum,即当前圈的最后一行的行号要大于起始行。

    第三步运行的条件是endY>circleNum && endX>circleNum,即当前圈的最后一行的行号要大于起始行,当前圈的最后一列 列号要大于起始列的列号。

    第四步运行条件是endY>circleNum+1 && endX>circleNum。

代码如下

    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        if(matrix.empty())
            return res;
        int circleNum = 0;
        int row = matrix.size();
        int col = matrix[0].size();
        while(row>2*circleNum && col>2*circleNum) //循环画圈
        {
            oneCircle(matrix,res,row,col,circleNum);
            circleNum++;
        }
        return res;
    }
    void oneCircle(vector<vector<int>> &matrix ,vector<int> &res,int row,int col,int circleNum)
    {
        int endX = col-1-circleNum; //每一圈的终止列
        int endY = row -1 - circleNum; //每一圈的终止行
        for(int i = circleNum;i<=endX;i++) //第一步一定会进行
            res.push_back(matrix[circleNum][i]);
        if(endY > circleNum) //第二步的进行条件
        {
            for(int i = circleNum+1;i<=endY;i++)
                res.push_back(matrix[i][endX]);
        }
        if(endX > circleNum && endY >circleNum)//第三步
        {
            for(int i =endX-1;i>=circleNum;i--)
                res.push_back(matrix[endY][i]);
        }
        if(endY >circleNum+1 && endX >circleNum)//第四步
        {
            for(int i = endY-1;i>=circleNum+1;i--)
                res.push_back(matrix[i][circleNum]);
        }
    }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值