自用
思路:
最重要的就是边界的处理,要保证每一条边对其进行的处理都是一致的。
处理规则:处理每一边最开始的地方,不处理最末尾的地方
注意几个参数:
给出的 n 是奇数还是偶数? 如果是奇数,则中间会多出一个,之后要手动给其赋值。
要循环几次?这里指的是大循环while 有几圈就循环几次 loop = n / 2。 while中还嵌套了for循环,表示每个边是怎样进行赋值的 ,这里要要注意每个for循环的写法,(关注好是怎样移动的,其实就知道怎么写for循环
因为每一圈的初始值是会改变的,所以设置了 startx, starty。还有边界也是会改变的,所以设置了offset (偏移量
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int loop = n / 2;
int count = 1; //矩阵的值
int startx = 0, starty = 0, offset = 1;
int i, j;
while(loop--)
{
//对新的一圈 i,j重新赋值!
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++;
}
// 此时 i,j的位置走到了退出循环的最后一圈的起始点
if(n % 2)
res[n/2][n/2] = count;
return res;
}
};