这篇博客讲解一下如何用一套代码过三道螺旋矩阵的题目
先看第一道
54. 螺旋矩阵
首先要明确螺旋的循环方向:右下左上……,其次明确上下左右边界。明确这两点就不难做了
一次循环一个方向就填一个值,这样就不会乱了
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>re;
int xn=matrix.size();//行数
int yn=matrix[0].size();//列数
int loop=xn*yn;//循环次数
vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
//边界
int right=yn-1;
int bottom=xn-1;
int left=0;
int upper=1;
//开始位置
int x=0;
int y=0;
int dir=0;//当前方向
while(loop--){
re.push_back(matrix[x][y]);
if(dir==0 && y==right){//往右走到了右边界
dir++;
right--;
}
if(dir==1 && x==bottom){//往下走到了下边界
dir++;
bottom--;
}
if(dir==2 && y==left){//往左走到了左边界
dir++;
left++;
}
if(dir==3 && x==upper){//往上走到了上边界
dir=0;
upper++;
}
//下一个位置
x+=around[dir].first;
y+=around[dir].second;
}
return re;
}
};
稍微改一下边界情况就OK了
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>re(n,vector<int>(n));
int loop=n*n;//循环次数
vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//各个方向的步长
int right=n-1;//右边界
int bottom=n-1;//下边界
int left=0;//左边界
int upper=1;//上边界
//开始位置
int x=0;
int y=0;
int num=1;
int dir=0;//0:往右走,1:往下走,2:往左走,3:往上走
while(loop--){
re[x][y]=num++;
if(dir==0 && y==right){//往右走到了右边界
dir++;
right--;
}
if(dir==1 && x==bottom){//往下走到了下边界
dir++;
bottom--;
}
if(dir==2 && y==left){//往左走到了左边界
dir++;
left++;
}
if(dir==3 && x==upper){//往上走到了上边界
dir=0;
upper++;
}
//下一个位置
x+=around[dir].first;
y+=around[dir].second;
}
return re;
}
};
这道题和前两道的区别在于开始位置不是从左上角开始,而且是从内往外旋,所以也就会出现越界的情况。
大体上没有改变,这是在填值的时候先判断在界内。
class Solution {
public:
vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
vector<vector<int>>re;
int t=1;
int right=cStart+1;
int bottom=rStart+1;
int left=cStart-1;
int upper=rStart-1;
int x=rStart;
int y=cStart;
vector<pair<int,int>>around={{0,1},{1,0},{0,-1},{-1,0}};//代表右下左上四个方向
int dir=0;//先向右走
while(t<=rows*cols){
if(x>=0 && x<rows && y>=0 && y<cols){
re.push_back({x,y});
t++;
}
if(dir==0 && y==right){//当前往右走,如果到达了右边界要变向
dir++;
right++;//右边界右移
}
if(dir==1 && x==bottom){
dir++;
bottom++;
}
if(dir==2 && y==left){
dir++;
left--;
}
if(dir==3 && x==upper){
dir=0;
upper--;
}
//下一个位置
x+=around[dir].first;
y+=around[dir].second;
}
return re;
}
};
总结:这三道题目没有设计到什么算法,就是模拟的题目,做这类题目要先分析模拟的过程,分析边界情况,然后再去实操。