其他分享
首页 > 其他分享> > 螺旋矩阵

螺旋矩阵

作者:互联网

螺旋矩阵Ⅱ

题目链接

代码随想录的解答非常清晰,这里贴上:

相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。

结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。

求解本题一定要坚持循环不变量原则

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

附上源地址: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