day1 螺旋矩阵II
照旧贴力扣题目
我是这样遍历矩阵的
- 先贴代码再展开说明
// An highlighted block
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int x = 0,y = 0,startX = 0,startY = 0,offset = 1,count = 1;
int loop = n/2;
vector<vector<int>> matrix(n,vector<int>(n));
while(loop--)
{
for(y = startY; y < n - offset; y++)
matrix[x][y] = count++;
for(x = startX ; x < n - offset; x++)
matrix[x][y] = count++;
for(; y > startY ; y--)
matrix[x][y] = count++;
for(; x > startX ; x--)
matrix[x][y] = count++;
startX ++;startY ++;offset++;
x = startX ;
}
if(n % 2 == 1)
matrix[n/2][n/2] = count++;
return matrix;
}
};
- x,y是我用来表示的数组的下标,startX和startY用来表示每次的起始位置,offset表示每次位置的偏移,用这张图来解释,第一轮遍历的1-4和5-8,距离顶点的偏移距离是1,到第二轮遍历是17-18,19-20,距离顶点的距离是2;startX和startY则是每次遍历的起始点,这里可以看到起始点都在对角线的左边部分。
- 循环条件loop = n/2,while(loop–) 。每次遍历的都是一个正方形,以5*5矩形为例,第一轮遍历边长是1-5,边长5,第二轮就是17-19,边长是3,所以每轮遍历都会让正方形边长减2,不足2就代表结束了
- 循环条件就是转圈圈的过程,每轮while循环增加起始点和偏移量,看图中箭头就行,我这里的程序while循环最后的x–会将[x][y]坐标从16指向起始点1,因此重新将起始点赋给x
- 最后的matrix[n/2][n/2] = count++;是因为如果n是偶数,那么最后一轮的遍历一定是以边长为1的正方形收尾,将数组全部遍历完,如果n是奇数,最后将会剩余一个中心点没有遍历到,需要将最后一个值赋给它,如下图所示
n为偶数时,能以正方形全部遍历完
n为奇数时,会剩余中心点没有遍历到