一.考虑解决方案
首先是移动方向分别是右,下,左,上,一般处理矩阵问题都是用一个向量表示,很自然的可以用以下表达方式来处理vector<vector<int>> direction={{0,1},{1,0},{0,-1},{-1,0}},接下来有一个重要的规律要能发现。
水平移动:
向右3次
向左2次
向右1次
垂直移动:
向下2次
向上1次
起始位置定再(0,-1)的位置。从上面的规律可以看出如果是一个m*n的矩阵,那么水平移动从n开始,垂直移动从m-1开始。所以一开始移动的时候我们首先要定位是水平还是垂直移动。定义int select[2]={n,m-1},接下来就是代码具体实现。
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
/*matrix 为输入矩阵*/
vector<int> result;//结果
int m=matrix.size();//行
int n=matrix[0].size();//列
if(!m||!n) return result;//检测是否为空
vector<vector<int>> direction={{0,1},{1,0},{0,-1},{-1,0}};//存方向的数组
int select[2]={n,m-1};//select[0]表示水平移动次数
int cur[2]={0,-1};//当前移动点的坐标
int dir=0;//当前方向0代表向右,1代表向下,2代表向左,3代表向上
while(select[dir%2])
{
int steps=select[dir%2];
for(int i=0;i<steps;i++)//在dir方向移动的次数
{
cur[0]+=direction[dir][0];
cur[1]+=direction[dir][1];
result.push_back(matrix[cur[0]][cur[1]]);
}
select[dir%2]--;//根据规律水平或者竖直方向减一
dir=(dir+1)%4;//按照顺序变换方向
}
return result;
}