螺旋矩阵
作者:互联网
螺旋矩阵Ⅱ
代码随想录的解答非常清晰,这里贴上:
相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。
结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。
求解本题一定要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
附上源地址:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E6%80%9D%E8%B7%AF
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> Matrix(n,vector<int>(n,0)); //矩阵初始化0
int startx = 0,starty = 0; //每一圈的起始位置
int loop = n/2; //螺旋的圈数
int offset = 1; //每次螺旋的长度缩短量
int count = 1; //给矩阵赋值
int mid = n/2; //若n为奇数,需要单独给矩阵的中心点赋值
int i,j;
while(loop--) { //一个螺旋圈要进行四次循环,分别是从左到右,从上到下,从右到左,从下到上
i = startx;
j = starty;
//每一条边的赋值保持左闭右开
for(; j < n - offset; j++) { //从左到右
Matrix[i][j] = count++;
}
for(; i < n - offset ; i++) { //从上到下
Matrix[i][j] = count++;
}
for(; j > starty; j--) { //从右到左
Matrix[i][j] = count++;
}
for(; i > startx; i--) { //从下到上
Matrix[i][j] = count++;
}
startx++;
starty++;
offset += 1;
}
if(n % 2) {
Matrix[mid][mid] = count;
}
return Matrix;
}
};
相关题目:螺旋矩阵
这道题我想用同样的思路解答,而因为这道题行数不等于列数,我就修改从左到右和从上到下的循环截止条件,即:
int m = matrix.size(); //矩阵的行数
int n = matrix[0].size(); //矩阵的列数
for(; j < n - offset; j++) { //从左到右
seq.push_back(matrix[i][j]);
}
for(; i < m - offset ; i++) { //从上到下
seq.push_back(matrix[i][j]);
}
并且,当行数为奇数时,会剩下最中间一行没有读取,所以加上以下代码:
if(m % 2) { //当行数为奇数时,需要单独读取矩阵mid的行数
for(j = starty; j < n - offset ; j++) {
seq.push_back(matrix[mid][j]);
}
}
但是,遇到了如下问题:
1、当行数为奇数时,最后读取最中间一行的代码存在问题,不能读取完所有的矩阵元素。
标签:count,Matrix,螺旋,++,矩阵,int,offset 来源: https://www.cnblogs.com/ynldaya/p/16678889.html