day2
就是一道模拟题哈。不过需要注意的是对每一条边的处理需要一致。
如图:
这里就是处理每条边的时候,保证最后一个数不被处理。留着给下一条边处理。所以这里就需要一个offset值,来控制边界。当进入到下一个循环时。offset的值是会改变的。当然这里也需要注意,每一条边处理的起始点也会改变,所以需要两个变量 startx starty。
其实这里比较有意思的是,每个小循环for,结束以后,i,j都会刚好到下一条边将要操作的点上。原因就是因为,for循环最后还会进行一次对变量的 ++ 或 -- 操作。当一个大循环结束以后,i,j又会回到起点。
出现的问题:
二刷: 3.25
我是二刷,忘记了处理 n 为单数的情况,其实就是直接赋值就好。还有忘记了对定义的容器vector进行初始化。二维的vector和一维的初始化,不同。需要注意一下。
vector<int> result(A.size(), 0)
vector<vector<int>> res(n, vector<int>(n, 0))
三刷:4.15
只记得。。。四个循环,忘了 startx starty
也忘了奇数的情况。
发现之前没注意到的点:
在四个循环的时候,注意 i,j代表的是什么,这个res 是二维数组有关系
res[i][j]
因为一维数组是需要连续的
i = startx
j = starty
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 记得初始化
int count = 1;
int startx = 0, starty = 0, offset = 1;
int loop = n / 2;
int i,j;
while(loop --)
{
i = startx, j = starty;
//一边一边来,每一边的处理方式都保持一致。
for(j = starty; j < n - offset; j++)
res[i][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[n / 2][n / 2] = count;
return res;
}
};