c++实现---顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
题目抽象:给一个二维矩阵,顺时针转圈打印矩阵。
转圈说:把矩阵最外层看成一个圈
顺时针转圈打印矩阵,那么我们可以先打印最外圈,然后再打印次外圈。
也就是不断收缩矩阵的边界
定义四个变量代表范围,lx、ly、rx、ry
向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 lx 加一;
向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 ry 减一;
向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 rx 减一;
向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 ly加一;
代码如下:

class Solution {
public:
    void print(int lx,int ly,int rx,int ry,vector<vector<int>> &matrix,vector<int> &res){
        for(int i=ly;i<=ry;++i) res.push_back(matrix[lx][i]);//从左到右
        for(int j=lx+1;j<=rx;++j) res.push_back(matrix[j][ry]);//从上到下
        int h=rx-lx+1;//计算当前循环高度
        if(h>1){//只有高度大于1才从右往左打印
            for(int ri=ry-1;ri>=ly;--ri) res.push_back(matrix[rx][ri]);
        }
        int w=ry-ly+1;//计算当前循环宽度
        if(w>1){//只有宽度大于1才从下往上打印
            for(int rj=rx-1;rj>lx;--rj) res.push_back(matrix[rj][ly]);
        }
    }
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        if(matrix.size()==0||matrix[0].size()==0){
            return res;
        }
        int lx=0,ly=0;
        int rx=matrix.size()-1,ry=matrix[0].size()-1;
        while(lx<=rx&&ly<=ry){//循环打印,直到矩阵超界,每次左上角点坐标+1,右上角坐标减一
            print(lx++,ly++,rx--,ry--,matrix,res);
        }
        
        return res;

    }
};

时间复杂度:O(mn), 矩阵中每个元素遍历一次
空间复杂度:O(mn), 每个元素需要存下来

猜你喜欢

转载自blog.csdn.net/Fizz6018/article/details/106863811