螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路
核心思路:定义四个方向,两种步长,每一个方向遍历之后,先将步长减一再换方向
答案
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
int row=matrix.size();
if(row == 0) {return result;}
int col=matrix[0].size();
if(col == 0) {return result;}
//4个方向向量
vector<vector<int> > dirs{ {0,1},{1,0},{0,-1},{-1,0} };//分别代表,右,下,左,上
//行和列分别可以移动多少步,每一个行方向或者列方向移动完之后,下一次的可以移动的距离就会减1
vector<int> steps{col,row-1};
//ir ic记录当前位置(0,-1)
int ir=0;
int ic=-1;
//idir记录当前方向,取值为0,1,2,3,对应右下左上,用来提取dirs里面的向量,初始值是右(0)
int idir = 0;
//如果当前方向上可以移动
while(steps[idir%2])//idir%2代表是行移动还是列移动
{
for(int i=0;i<steps[idir%2];i++)//对该方向上的每一个元素
{
ir += dirs[idir][0];
ic += dirs[idir][1];
result.push_back(matrix[ir][ic]);
}
//一定是先步长减1,再换方向
steps[idir%2]--;//每改变一次方向,下次该方向的步长减1
idir = (idir+1)%4;//换方向
}
return result;
}
};