大一的时候写过这道题目,当时费了老半天劲,第二次写思路就能清晰一点,但是还有一点小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; } };