大一的时候写过这道题目,当时费了老半天劲,第二次写思路就能清晰一点,但是还有一点小bug,在控制方向的时候很容易出错。
变量
- 方向:
int left = 0, right = 1, up = 0, down = 0; //等于1时表示往该方向前进
- 范围:
colMin = 0, rowMin = 0, rowMax = array.size()-1, colMax = array[0].size()-1; // colMin, colMax表示列左右界限下标,row为行。
思路
每次先判断方向,假如:
right == 1;
则向右走,先将col加一,然后push变量。此时进行判断,若已经走到了最右,即:
col == colMax;
则已经走到了最右,该转换方向了,转向下,此时刚刚走过的一行就不会被再次访问了,所以行的上界也要加一。
down = 1; right = 0; rowMin++;
代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
int rowMin = 0, colMin = 0, rowMax = matrix.size()-1, colMax = matrix[0].size()-1;
int row = 0, col = -1, left = 0, right = 1, up = 0, down = 0;
int number = (rowMax+1)*(colMax+1);
vector<int> result;
while(number--){
if(left){
col--;
result.push_back(matrix[row][col]);
if(col==colMin){
up = 1;
left = 0;
rowMax--;
}
continue;
}
else if(right){
col++;
result.push_back(matrix[row][col]);
if(col==colMax){
down = 1;
right = 0;
rowMin++;
}
continue;
}
else if(up){
row--;
result.push_back(matrix[row][col]);
if(row==rowMin){
up = 0;
right = 1;
colMin++;
}
continue;
}
else{
row++;
result.push_back(matrix[row][col]);
if(row==rowMax){
down = 0;
left = 1;
colMax--;
}
continue;
}
}
return result;
}
};
京公网安备 11010502036488号