标签:count Matrix 螺旋 ++ 矩阵 int offset
螺旋矩阵Ⅱ
代码随想录的解答非常清晰,这里贴上:
相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。
结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。
求解本题一定要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
附上源地址: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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。