题解 | #顺时针打印矩阵#
顺时针打印矩阵
http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
二维数组中的变量
这道题目的难点在于确定循环出口,而确定循环出口又需要边界变量的配合,所以问题最后还是得归结到边界变量得设置上。
计数变量何时增减?
一开始想的是输出一行或者一列的元素之后就改变边界元素的值,但是明显有误。
设计几个变量?
一开始打算设计两个变量boundup、bounddown
分别输出右上边框和左下边框,但是确认左右边界太麻烦了。
一个可行的思路
设计四个计数变量分别表示上、下、左、右四个边界,这样在遍历的时候确认边界就很简单了;与此同时,在遍历数组一圈之后再进行变量的集体增减来改变边界才正确。
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> array;
array.reserve(10000);
int row = matrix.size();
int col = matrix[0].size();
// int boundup=0,bounddown=col;
int r0=0,c0=0,r1=row-1,c1=col-1;
while(r1>=r0 && c1>=c0){
//上一行
for(int i=c0;i<=c1;i++) array.push_back(matrix[r0][i]);
//右一列
for(int i=r0+1;i<=r1;i++) array.push_back(matrix[i][c1]);
//下一行
if(r0!=r1){
for(int i=c1-1;i>=c0;i--) array.push_back(matrix[r1][i]);
}
//左一列
if(c0!=c1){
for(int i=r1-1;i>r0;i--) array.push_back(matrix[i][c0]);
}
r0++;r1--;
c0++;c1--;
}
return array;
/*do{
while(i<bounddown-1){
if(i==boundup){//遍历matrix[0]
for(auto m=matrix[boundup].begin();m<matrix[boundup].end();m++){
array.push_back(*m);
boundup++;
col--;
}
}
else array.push_back(matrix[i][col-1])
i++;
}
while(i>boundup){
if(i==bounddown){//遍历m
for
}
}
}while(boudup!=bounddown)*/
}
};