题目
思路
模拟顺时针画矩阵的过程,先填充上行从左到右,右列从上到下,下行从右到左,左列从下到上,由外圈到内圈一直画下去。
每一条边都要坚持一个原则:左闭右开
如图
每一种颜色,代表一条边,遍历的长度。每条边遵循一样的原则。
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//使用vector定义一个二维数组
vector<vector<int>> res(n, vector<int>(n, 0));
//定义每一圈的起始位置
int startX = 0;
int startY = 0;
//每个圈循环几次
int loop = n/2;
//矩阵中间位置
int mid = n/2;
//给矩阵赋的值
int count = 1;
//控制边的遍历长度,每次循环收缩一
int offset = 1;
int i,j;
while(loop--){
i = startX;
j = startY;
//下面开始四个for就是模拟转了一圈
//模拟上行从左到右(左闭右开)
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 控制每一圈里每一条边的遍历长度
offset++;
}
//如果n为奇数,需要单独给矩阵最中间的位置赋值
if(n % 2){
res[mid][mid] = count;
}
return res;
}
};