曾經的代碼
模擬螺旋,選了四個邊界 但是循環套的很亂。
class Solution {
public:
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int rows=matrix.size();
if(rows==0) return res;
if(rows==1) return matrix[0];
int cols=matrix[0].size();
int x=0,y=-1,minx=0,miny=0;
int num=rows*cols;
while(res.size()!=num)
{
for(int i=0;i<4&&res.size()!=num;i++)
{
while(1)
{
x+=move[i][0];
y+=move[i][1];
if(x>=rows||x<minx||y>=cols||y<miny)
{
x-=move[i][0];
y-=move[i][1];
break;
}
res.push_back(matrix[x][y]);
}
if(i==0) minx++;
}
rows--;
cols--;
miny++;
}
return res;
}
};
學習了題解的改良版
x:上邊界 rows:下邊界
y:左邊界 cols:右邊界
參考題解
通過邊界改動刪去遍歷過的那一行/列的數字。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.size()==0) return res;
int rows=matrix.size()-1;
int cols=matrix[0].size()-1;
int x=0;
int y=0;
while(true)//右下左上
{
for(int i=y;i<=cols;i++)
res.push_back(matrix[x][i]);
x++;
if(x>rows) break;
for(int i=x;i<=rows;i++)
res.push_back(matrix[i][cols]);
cols--;
if(cols<y) break;
for(int i=cols;i>=y;i--)
res.push_back(matrix[rows][i]);
rows--;
if(x>rows) break;
for(int i=rows;i>=x;i--)
res.push_back(matrix[i][y]);
y++;
if(cols<y) break;
}
return res;
}
};