方法1:右侧和下侧填0,遇0换方向,走过的值变成0,相当于边界。但要注意左侧的情况,因为左边没填0,所以要单独列出第0列的情况,即j==-1时也要换方向。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
vector<int> res;
int m=(int)matrix.size();//求矩阵行数
// int m=sizeof(matrix)/sizeof(int);这个算出来不对,不知道为啥
int n=(int)matrix[0].size();//求矩阵列数
for(int i=0;i<m;i++)
{
matrix[i].push_back(0);
}
vector<int> zero;
for(int i=0;i<=n;i++)
{
zero.push_back(0);
}
matrix.push_back(zero);
int step=0;
int i=0,j=0,k=0;
while(step!=m*n)
{
step++;
res.push_back(matrix[i][j]);
matrix[i][j]=0;
i+=xx[k];
j+=yy[k];
if(j==-1||matrix[i][j]==0)//最外圈左边记得判断,因为没加0,否则会越界!出现-1
{
i-=xx[k];
j-=yy[k];
k=(k+1)%4;
i+=xx[k];
j+=yy[k];
}
}
return res;
}
};
方法二:收缩边界
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; int m=(int)matrix.size();//求矩阵行数 int n=(int)matrix[0].size();//求矩阵列数 //上下左右边界 int u=0; int d=m-1; int l=0; int r=n-1; while(1) { for(int i=l;i<=r;i++) { res.push_back(matrix[u][i]);//向右移动直到最右 } if(++u>d) break;//重新设定上边界,若上边界大于下边界,则遍历完成 for(int j=u;j<=d;j++) { res.push_back(matrix[j][r]); } if(--r<l) break;//重新设定右边界 for(int i=r;i>=l;i--) { res.push_back(matrix[d][i]); } if(--d<u) break;//重新设定下边界 for(int j=d;j>=u;j--) { res.push_back(matrix[j][l]); } if(++l>r) break;//重新设定左边界 } return res; } };