问题
题目:[顺时针打印矩阵]
思路
这个题倒是不难,不过也花了我一段时间。
首先,先说最基本的情形。
那就是四个方向扫描,然后扫描完毕之后,更新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;
}
};