天天看点

JZ19-顺时针打印矩阵

【题目描述】

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

例如,如果输入如下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.

JZ19-顺时针打印矩阵

【官方解法】

class Solution {
public:
     
     //定义print函数打印每一个圈的数字
     //本题有两个圈,外圈:[1,2,3,4,8,12,16,15,14,13,9,5],内圈:[6,7,11,10]
     //lx ly rx ry分别为左上角和右下角的坐标,matrix为原矩阵,ret为输出数组
    void print(int lx, int ly, int rx, int ry, vector<vector<int>> &matrix, vector<int> &ret) {

        for (int j=ly; j<=ry; ++j) ret.push_back(matrix[lx][j]);
        //1.ly=0,ry=3,ret中有1,2,3,4
        //2.ly=1,ry=2,ret中有1,2,3,4,8,12,16,15,14,13,9,5,6,7
        
        for (int i=lx+1; i<=rx; ++i) ret.push_back(matrix[i][ry]);
        //1.lx+1=1,rx=4,ret中有1,2,3,4,8,12,16
        //2.ret中有1,2,3,4,8,12,16,15,14,13,9,5,6,7,11
        int h = rx - lx + 1;
        //1.h=3-0+1=4
        //2.h=2-1+1=2
        if (h > 1)
            for (int rj=ry-1; rj>=ly; --rj) ret.push_back(matrix[rx][rj]);
            //1.ry-1=3,ly=3,ret中有1,2,3,4,8,12,16,15,14,13
            //2.ret中有1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
        int w = ry - ly + 1;
        //1.w=3-0+1=4
        //2.w=2-1+1=2
        if (w > 1)
            for (int ri = rx-1; ri>=lx+1; --ri) ret.push_back(matrix[ri][ly]);
           // 1.rx-1=3,lx+1=1,ret中有1,2,3,4,8,12,16,15,14,13,9,5
           //2.rx-1=1,lx+1=2,不满足for循环条件不执行
    }

  //matrix为[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
    vector<int> printMatrix(vector<vector<int>>& matrix) {
        vector<int> ret;//定义输出矩阵ret
        if (matrix.empty()) return ret;//判空操作
        int lx = 0, ly = 0; //左上角坐标为(0,0)
        int rx = matrix.size()-1, ry = matrix[0].size()-1;//右下角坐标
        while (lx <= rx && ly <= ry) {
            print(lx++, ly++, rx--, ry--, matrix, ret);//先用再--
            //1.lx=0,ly=0,rx=3,ry=3,ret中有1,2,3,4,8,12,16,15,14,13,9,5
            //2.lx=1,ly=1,rx=2,ry=2,ret中有1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
            //3.lx=2,ly=2,rx=1,ry=1,条件不满足不执行
        } 
        return ret;
    }

};
           

【B站解法】

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        //定义方向
        //碰壁换方向  右下左上
        
        if(matrix.empty()) return res;//判空操作
        
        int n = matrix.size(), m = matrix[0].size(); //查询数组大小
        vector<vector<bool>> state(n, vector<bool>(m, false));//定义临时存储数组
        int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; //换方向提示变量 上右下左
        int x = 0, y = 0, d = 1;//由于是右下左上所以是d=1
       
        for(int i = 0; i < n * m; i ++)
        {
            res.push_back(matrix[x][y]);  1;2
            state[x][y] = true;
            
            int a = x + dx[d], b = y + dy[d];  0,1;
            if(a < 0 || a >= n || b < 0 || b >= m || state[a][b] == true)   
            {
                d = (d + 1) % 4;//除以4取余数
                a = x + dx[d], b = y + dy[d];
            }
            
            x = a, y = b; 0,1
        }
        
        return res;
    }
};
           

思考;

若int dx[4] = { 0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};右下左上

那么int d=0;下面的 d = d + 1

解决:

不应该是d=d+1,还应该是d=(d+1)%4,因为不止有一圈,所以数组会越界。

按道理可以想法可以,但是无法通过,不太理解?

JZ19-顺时针打印矩阵

继续阅读