输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
题目抽象:给一个二维矩阵,顺时针转圈打印矩阵。
转圈说:把矩阵最外层看成一个圈
顺时针转圈打印矩阵,那么我们可以先打印最外圈,然后再打印次外圈。
也就是不断收缩矩阵的边界
定义四个变量代表范围,lx、ly、rx、ry
向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 lx 加一;
向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 ry 减一;
向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 rx 减一;
向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 ly加一;
代码如下:
class Solution {
public:
void print(int lx,int ly,int rx,int ry,vector<vector<int>> &matrix,vector<int> &res){
for(int i=ly;i<=ry;++i) res.push_back(matrix[lx][i]);
for(int j=lx+1;j<=rx;++j) res.push_back(matrix[j][ry]);
int h=rx-lx+1;
if(h>1){
for(int ri=ry-1;ri>=ly;--ri) res.push_back(matrix[rx][ri]);
}
int w=ry-ly+1;
if(w>1){
for(int rj=rx-1;rj>lx;--rj) res.push_back(matrix[rj][ly]);
}
}
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> res;
if(matrix.size()==0||matrix[0].size()==0){
return res;
}
int lx=0,ly=0;
int rx=matrix.size()-1,ry=matrix[0].size()-1;
while(lx<=rx&&ly<=ry){
print(lx++,ly++,rx--,ry--,matrix,res);
}
return res;
}
};
时间复杂度:O(mn), 矩阵中每个元素遍历一次
空间复杂度:O(mn), 每个元素需要存下来
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)