您的位置:首页 > Web前端

剑指offer-顺时针打印矩阵

2017-05-17 21:34 288 查看

问题

题目:[顺时针打印矩阵]

思路

这个题倒是不难,不过也花了我一段时间。

首先,先说最基本的情形。

那就是四个方向扫描,然后扫描完毕之后,更新i,j坐标和边界。

基本的情形好说,问题是针对特例过不去,比如只有一行,只有一列。

上面的情形是针对正方形可以过的去,其余情形不行,倒不是不适用。

会反复加入元素,所以每次在进行上面的更新时,先进行判断。

如果元素加入完毕,跳出即可。

或者像我第一次过的办法,加入visit矩阵也可解决这个问题。

其实这个题目还是比较考察鲁棒性的!

代码

class Solution {
public:
vector<int> printMatrix(vector<vector<int> >& matrix) {

vector<int> ret;
int m = matrix.size();
if(!m) return ret;

int n = matrix[0].size();
if(!n) return ret;

int up = 0;
int down = m-1;
int left = 0;
int right = n-1;

int total = m*n;
int cur = 0;

int i=0,j=0;
while(cur < total){

while( j <= right ){

++cur;
ret.push_back(matrix[i][j]);

++j;
}
if(cur==total) break;
--j;
++i;
++up;

while( i <= down ){

++cur;
ret.push_back(matrix[i][j]);

++i;
}
if(cur == total) break;
--i;
--j;
--right;

while( j >= left ){

++cur;
ret.push_back(matrix[i][j]);

--j;
}
if(cur == total) break;
++j;
--i;
--down;

while(i>=up){

++cur;
ret.push_back(matrix[i][j]);

--i;
}
if(cur == total) break;
++i;
++j;
++left;
}
return ret;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: