链接:
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;
}
};