算法思想:
C++
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0; // 定义每循环一个圈的起始x位置
int starty = 0; // 定义每循环一个圈的起始y位置
// 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
int loop = n / 2;
// 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
int mid = n / 2;
int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度
int num = 1; // 用来给矩阵中每一个空格赋值
int i, j;
while(loop > 0){
i = startx;
j = starty;
// 下面开始的四个for就是模拟转了一圈
// 模拟填充上行从左到右(左闭右开)
for(j = starty; j < starty + n - offset; j++){
res[i][j] = num;
num++;
}
// 模拟填充右列从上到下(左闭右开)
for(i = startx; i < startx + n - offset; i++){
res[i][j] = num;
num++;
}
// 模拟填充下行从右到左(左闭右开)
for(; j > starty; j--){
res[i][j] = num;
num++;
}
// 模拟填充左列从下到上(左闭右开)
for(; i > startx; i--){
res[i][j] = num;
num++;
}
// 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0)
//第二圈起始位置是(1, 1)
startx++;
starty++;
loop--;
offset += 2;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if(n % 2 == 1){
res[mid][mid] = num;
}
return res;
}
};
复杂度分析:
- 时间复杂度:O(n)。
- 空间复杂度:O(n)。