思路:
我们分析顺时针旋转过程:
- 方向旋转是一个循环运动;
- 方向会在适当位置会变: i.边界; ii.遇到遍历过的点;
- 方向的运行过程: 正右、正下、正左、正上;
那么怎么实现呢?
- 对于1:循环,我们联想到模运算;
- 对于2:新增visited矩阵,记录遍历过的点;
- 对于3:二维矩阵或pair,模拟单位方向向量;
代码:
class Solution {
public:
// 观察图可知,变动的部分有两个
// 1.点每一次移动一步
// 2.方向会在适当时会变
// 模拟出这两个点就可以模拟螺旋移动;关键在掌握方向的变动
// 对于方向:1.每次变动跟上一次是具有恒定的继承关系:右下左上 2. 遇到边界变动一次 3.遇到遍历过的变动一次
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int directions[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; // 正右,正下,正左,正上
int directionindex = 0;
int n = matrix[0].size();
int m = matrix.size();
vector<vector<bool>> ump(m,vector<bool>(n,0));
vector<int> ans;
int row =0; int col =0;
for(int step=0;step<n*m;step++)
{
ump[row][col] = 1;
ans.push_back(matrix[row][col]);
int nextrow= row + directions[directionindex][0]; int nextcol =col+ directions[directionindex][1];
if(nextrow <0 || nextrow >= m || nextcol<0 || nextcol>=n || ump[nextrow][nextcol])
{
directionindex = (directionindex+1)%4;
}
row+=directions[directionindex][0];col+=directions[directionindex][1];
}
return ans;
}
};