题解 | #螺旋矩阵#
螺旋矩阵
https://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31
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; } };
此题要先确定左开右闭方式,并且要注意特殊情况分类,其实就是只有一列或者只有一行的情况,如果不排除这些情况,可能会出现收集不到死循环,或者重复收集的问题