给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
class Solution {
public:
vector<vector<int>> generateMatrix(int n) { //定义函数generateMatrix,返回值类型为二维数组,参数为n
vector<vector<int>> res(n,vector<int>(n,0)); //定义一个二维数组。n行n列 初始化为0
int startx=0; //定义起始点的行坐标
int starty=0; //列坐标
int loop=n/2; //圈数为行数除以2,因为绕一圈多两行。
int mid=n/2; //中间点的行、列坐标
int count=1; //定义计数器,后面填充数组
int offset=1; //定义偏移量
int i,j; //一定要下面的for循环之前先定义i和j,这样下面的for循环都可以共享这俩变量,在for循环里面定义的变量,只能在该for循环里面起作用。
while(loop--)
{
for(j=starty;j<n-offset;j++) //第一行,左闭右开
{
res[startx][j]=count++;
}
for(i=startx;i<n-offset;i++) //最右边一列,也是左闭右开
{
res[i][j]=count++;
}
for(;j>starty;j--) //最下边的一行,左闭有空
{
res[i][j]=count++;
}
for(;i>startx;i--) //最左边一列,左闭右开
{
res[i][j]=count++;
}
startx++; //每一圈结束后,把起始点的坐标加一,偏移量也加一,准备内层螺旋
starty++;
offset++;
}
if (n % 2) {
res[mid][mid] = count; //如果n是奇数,则填上最中间的一个点。
}
return res;
}
};
注意:
1.螺旋的圈数由n/2得到
2.一定要在for循环外,在while循环之前,定义好i和j,因为for循环内部定义的变量,只能内部使用。
3.while循环中的四个for循环,都是左闭右开,把正方形的四个边过一遍。
4.每一层圈循环结束后,一定记得把起始点和偏移量加1.
5.注意n为奇数,再加上中间的点。
出自:代码随想录