学习安排根据《代码随想录》~59
想了半个钟头找不到思路,个人感觉有以下难点:
一、数组索引怎么控制
二、如何确定循环几次
三、如何确定结束时间
看了解析,才有点头绪。
一、坐标控制元素位置
二、区间遵守 前闭后开 原则
三、循环次数根据 n来确定
四、二维数组存在一个中间位置 赋值
看完解析后,自己码了一遍代码还是出现各种错误,对照答案改了 并做一次总结:
class Solution {
public:
vector<vector<int>> generateMatrix(int n)
{
vector<vector<int>>res(n,vector<int>(n,0));//创建一个二维数组
int x=0;int y=0;//记录元素坐标位置
int loop=n/2 ;// 当n为3时,圈数为1圈,中间位置元素单独算
int mid=n/2;//中间位置 n为3时 [1,1] n为5时 [2,2]
int count =1;//从1开始计数
int offset=1;
int i,j;//用i,j来做循环判断
while(loop--)
{
i=x;
j=y;
//初始化
for(j=y;j<y+n-offset;j++) //i 不变 j 变
{
res[x][j]=count++;
}
for(i=x;i<x+n-offset;i++) // j 不变 i变
{
res[i][j]=count++;
}
for(;j>y;j--) // i 不变 j变
{
res[i][j]=count++;
}
for(;i>x;i--)// j 不变 i变
{
res[i][j]=count++;
}
//下一圈开始 因为区间取值特性 x,y得从[1,1]开始
x++;y++;
// 因为区间取值特性,所以 下一层比上一层还要少2
offset=offset+2;
}
//当 n为奇数时,中间位置需要令做处理
if(n%2)
{
res[mid][mid]=count;
}
return res;
}
};
重点:
1. for循环中的 for(j=y;j<y+n-offset;j++)
offset 设置为1,为了确保每条边末尾不计入前一次循环中,确保 前闭后开原则;
但是 当圈数进行到下一层时,offset 是会增加的,所以不可以设置为固定值。
2. x++;y++;
下一圈开始的时候,元素坐标从 0,0 -> 1,1 ,再下一圈 从 2,2 开始, 所以每一圈开始前 起始的坐标发生变化
3.
if(n%2)
{
res[mid][mid]=count;
}
当n为奇数时,会单独 多出来一个中间元素 需另外计算。
(ps:圈数怎么看?)