可以控制上下左右的最值直接模拟
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
int row=matrix.size();
if(row==0)
return ans;
int col=matrix[0].size();
int i=0,j=0,k,t=0;
int uprow=1,lowrow=row-1;
int lcol=0,rcol=col-1;
ans.push_back(matrix[i][j]);
int cnt=1;
int M=row*col;
while(cnt<M)
{
while(j+1<=rcol&&cnt<M)
{
ans.push_back(matrix[i][++j]);
cnt++;
}
rcol=j-1;
while(i+1<=lowrow&&cnt<M)
{
ans.push_back(matrix[++i][j]);
cnt++;
}
lowrow=i-1;
while(j-1>=lcol&&cnt<M)
{
ans.push_back(matrix[i][--j]);
cnt++;
}
lcol=j+1;
while(i-1>=uprow&&cnt<M)
{
ans.push_back(matrix[--i][j]);
cnt++;
}
uprow=i+1;
}
return ans;
}
};
update:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
int row=matrix.size();
if(row==0)
return ans;
int col=matrix[0].size();
int m=row-1,n=col-1;
for(int i=0,j=0,x=0,y=0;x<=m&&y<=n;x++,y++)
{
for(j=y;j<=n;j++)
{
ans.push_back(matrix[x][j]);
}
for(i=x+1;i<=m;i++)
{
ans.push_back(matrix[i][n]);
}
for(j=n-1;j>=y&&x!=m;j--)
{
ans.push_back(matrix[m][j]);
}
for(i=m-1;i>x&&y!=n;i--)
{
ans.push_back(matrix[i][y]);
}
m--;
n--;
}
return ans;
}
};