【算法】
层层打印,每层的边按 上-右-下-左 的顺序打印,从左上角开始.
顺时针从外向里打印矩阵,除了最里层,其他都定能形成一个个口字形圈圈.
设矩阵行号为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;
}
};