剑指offer 顺时针打印矩阵

链接: https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?toCommentId=1465900
来源:牛客网

先打印最外圈,打印顺序1 2 3 4 5 6,7 8 9,10 9 8 7 6 5,4 3 2
再打印次外圈,打印顺序3 4 5 6,7,8 7 6 5,4
依次类推向内打印,一共打印n/2圈,其中n为行数和列数的最小值(这里行数row为4,列数col为7,所以n=4/2=2);最后结果分以下几种情况:
1    row和col最小值为偶数时,最后能完整打印完,不会剩下一行或一列或一个元素的情况。
2     row<col&&row%2!=0,最后会剩下一行。如3*5矩阵,只打印最外层一圈,最后剩下第二行。
3     col<row&&col%2!=0,最后会剩下一列。如5*3矩阵,只打印最外层一圈,最后剩下第二列。
4     row=col&&col%2!=0,最后会剩下一个元素。如:5*5矩阵,打印外层2圈,最后最内的一个元素没打印

代码:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> >a) {
        vector<int>res;
        if(a.size()==0)return res;
        int row=a.size(),col=a[0].size(),i,j,k;
        int n=row<=col?row/2:col/2;
        for(i=0;i<n;i++){//顺时针打印n/2圈
            for(j=0;j<col-1-2*i;j++) res.push_back(a[i][i+j]);
            for(j=0;j<row-1-2*i;j++) res.push_back(a[i+j][col-1-i]);
            for(j=0;j<col-1-2*i;j++) res.push_back(a[row-1-i][col-1-i-j]);
            for(j=0;j<row-1-2*i;j++) res.push_back(a[row-1-i-j][i]);
        }
        if(row==col&&row%2!=0)res.push_back(a[row/2+1][row/2+1]);
        else if(row>col&&col%2!=0)for(k=i,j=i;i<=row-2*k;i++)res.push_back(a[i][j]);
        else if(row<col&&row%2!=0)for(k=i,j=i;j<=col-2*k;j++)res.push_back(a[i][j]);
        return res;   
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42130471/article/details/80945756