class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int loop=n/2;
int StartX=0,StartY=0,EndX=n-1,EndY=n-1;
int count=1;
vector<vector<int>>res(n,vector<int>(n,0));
while(loop--){
for(int j=StartY;j<EndY;j++){
res[StartX][j]=count++;
}
for(int i=StartX;i<EndX;i++){
res[i][EndY]=count++;
}
for(int j=EndY;j>StartY;j--){
res[EndX][j]=count++;
}
for(int i=EndX;i>StartX;i--){
res[i][StartY]=count++;
}
StartX++,StartY++;
EndX--,EndY--;
}
if(n%2==1)res[n/2][n/2]=count;
return res;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>nums;
int StartX=0,StartY=0;
int EndX=matrix.size()-1,EndY=matrix[0].size()-1;
while(true){
for(int j=StartY;j<=EndY;j++){
nums.push_back(matrix[StartX][j]);
}
if(++StartX>EndX)break;
for(int i=StartX;i<=EndX;i++){
nums.push_back(matrix[i][EndY]);
}
if(--EndY<StartY)break;
for(int j=EndY;j>=StartY;j--){
nums.push_back(matrix[EndX][j]);
}
if(--EndX<StartX)break;
for(int i=EndX;i>=StartX;i--){
nums.push_back(matrix[i][StartY]);
}
if(++StartY>EndY)break;
}
return nums;
}
};
class Solution {
public:
vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
vector<vector<int>>res;
vector<vector<int>>dir{{0,1},{1,0},{0,-1},{-1,0}};
int i=rStart,j=cStart,pos=0,k=0;
while(pos!=rows*cols){
int x=dir[k&3][0],y=dir[k&3][1];
for(int count=0;count<k/2+1;count++){
if(i>=0 && j>=0 && i<rows&& j<cols){
res.push_back({i,j});
pos++;
}
i+=x;
j+=y;
}
k++;
}
return res;
}
};
总结:
其实螺旋矩阵的话,感觉它并没有什么很复杂的知识点,主要需要考虑的就是,选择左闭右开还是左闭右闭,这个主要是用来判断边界条件,然后按照矩形的每一条边依次考虑。