【剑指offer】顺时针打印矩阵(找规律)

本文详细解析了一种矩阵螺旋打印算法,该算法能够按顺时针螺旋顺序打印矩阵中的元素。通过实例展示,如4x4矩阵的打印过程,文章深入讲解了算法的实现原理,包括如何分圈层遍历矩阵并按指定顺序收集元素。

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

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        // todo 加入异常判断
        int rows = matrix.size();
        int cols = matrix[0].size();

        vector<int> ret;
        for (int i= 0; 2*i < rows && 2*i < cols; ++i){
            printCircle(matrix,rows,cols,i,ret);
        }
        return ret;
    }

    void printCircle(vector<vector<int> > matrix,int rows,int cols, int index,vector<int> &ret){ // index表示第几圈;从第0圈开始


        int endY = cols - index - 1;    // 最后纵坐标
        int endX = rows - index - 1;    // 最后横坐标
        // 从左到右
        for(int i = index; i<= endY; ++i )
            ret.push_back(matrix[index][i]);

        // 从上到下
        // 需要第二步条件:终止行号大于起始行号;圈内至少两行
        if (endX > index){
            for(int i = index +1 ; i<= endX; ++i)
                ret.push_back(matrix[i][endY]);
        }
        

        // 从右到左
        // 需要第三步条件:终止行号大于起始行号;圈内至少两行两列
        if (index < endX && index < endY){
            for(int i = endY-1; i>= index ; --i)
                ret.push_back(matrix[endX][i]);
        }
        
        // 从下到上
        // 需要第四步条件:圈内至少三行两列;
        if (index < endY && index < endX-1){
            for(int i = endX -1; i> index; --i)
                ret.push_back(matrix[i][index]);
        }

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值