头像

碎月雨中奏


关注数
0
粉丝数
0
阅读量
39


离线:4天前



【算法】

层层打印,每层的边按 上-右-下-左 的顺序打印,从左上角开始.

顺时针从外向里打印矩阵,除了最里层,其他都定能形成一个个口字形圈圈.

设矩阵行号为0-n,列号为0-m,每一层从外到里编号为0 - min(n/2, m/2),第k层从(k, k)开始打印,

那么对于第k层来说,上面那行从(k, k) 到 (k, m-k),右边那列从(k, m-k) 到 (n-k, m-k),下面那行从(n-k, m-k) 到 (n-k, k),左边那列从(n-k, k) 到 (k, k),

当k=n-k时,最里面那层就是单独一行;当k=m-k时,最里面那层就是单独一列,这两种情况单独列出即可.

【C++ 代码】

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> res;
        int n=matrix.size()-1;
        if(n<0) return res;
        int m=matrix[0].size()-1;
        int k=0;//层号
        while(k<n-k && k<m-k) {
            for(int i=k ;i<m-k; i++) res.push_back(matrix[k][i]);
            for(int i=k; i<n-k; i++) res.push_back(matrix[i][m-k]);
            for(int i=m-k; i>k; i--) res.push_back(matrix[n-k][i]);
            for(int i=n-k; i>k; i--) res.push_back(matrix[i][k]);
            k++;
        }
        if(k==n-k)//打印最后一行
            for(int i=k; i<=m-k; i++) res.push_back(matrix[k][i]);
        if(k==m-k)//打印最后一列
            for(int i=k; i<=n-k; i++) res.push_back(matrix[i][k]);
        return res;
    }
};