class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
//对每一条采取左闭右开的遍历方法
vector<int> res;
int m=matrix.size();
if(m==0)
{
return res;
}
int n=matrix[0].size();
if(n==0)
{
return res;
}
int count=m*n;
int i=0,j=0;//(i,j)对应矩阵中的一个元素
int offset=1;//因为是左开右闭上因此offset初始设置为1,同时offset也表示转的圈数
while(res.size()!=count)//未收集完成时循环
{
for(;j<n-offset;++j)//从左到右收集
res.push_back(matrix[i][j]);
for(;i<m-offset;++i)//从上到下收集
res.push_back(matrix[i][j]);
if(i!=offset-1)//如果说当前圈的第一行,说明本圈只有一行,剩下一个元素,直接收集
{
for(;j>offset-1;--j)//从右到左收集
res.push_back(matrix[i][j]);
}
else //直接收集一个元素
{
res.push_back(matrix[i][j]);
break;
}
if(j!=n-offset)//如果说从右到左收集后,j还在本圈右边,说明本圈只有一列,还剩下一个元素,直接收集
{
for(;i>offset-1;--i)
res.push_back(matrix[i][j]);//从下到上收集
}
else//直接收集一个元素
{
res.push_back(matrix[i][j]);
break;
}
++offset;//下一圈
j=offset-1;//起始位置改变
i=offset-1;
}
return res;
}
};
此题要先确定左开右闭方式,并且要注意特殊情况分类,其实就是只有一列或者只有一行的情况,如果不排除这些情况,可能会出现收集不到死循环,或者重复收集的问题



京公网安备 11010502036488号