对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]
题意如下图所示:
顺时针,首先遍历最外面一层,1,2,3,4,7,10,4,3,2,1,7,4
然后遍历里面一层:5,6,9,8
因此解题思路就是将数据从外层向里层层层遍历,要注意判定条件
class Printer {
public:
vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
// write code here
vector<int> res;
int i=0; //行
int y=0; //列
while(i<=n/2 && y<=m/2) {
int p=i;
while(p<=n-i-1 && y<=m-y-1){
if(p==i)
for(int j=i;j<m-i;j++)
res.push_back(mat[p][j]);
else if(p==n-1-i){
for (int j=m-i-1;j>=i;j--)
res.push_back(mat[p][j]);
if (m-1-i!=i){
for (int x=n-i-2;x>=i+1;x--)
res.push_back(mat[x][i]);
}
}
else{
res.push_back(mat[p][m-1-i]);
}
p++;
}
i++;
y++;
}
return res;
}
};
第一个while是判断进行多少层遍历,相当于将矩阵进行折叠。要注意,同时判断行和列
第二个while则是在一层中进行遍历,while中的条件是对层数进行限定。
第一个if是对第一行进行遍历
if(p==i)
for(int j=i;j<m-i;j++)
res.push_back(mat[p][j]);
else if(p==n-1-i){
for (int j=m-i-1;j>=i;j--)
res.push_back(mat[p][j]);
if (m-1-i!=i){
for (int x=n-i-2;x>=i+1;x--)
res.push_back(mat[x][i]);
}
}
中间的if(m-1-i!=i)表示如果这一层只有一列时,就不会再往上遍历。
第三个else是对第一行和最后一行之间进行遍历
else{
res.push_back(mat[p][m-1-i]);
}