题目来源
题目描述
题目解析
模拟(设定边界)
- 生成一个n * n空矩阵mat,随后模拟整个向内环绕的填入过程
- 定义当前左右上下边界l、r、t、b,初始值num = 1,迭代终止值tar = n * n
- 当num <= tar时,始终按照从左到右、从上到下,从右到左、从下到上填入顺序循环,每次填入后:
- 执行num += 1,得到下一个需要填入的数字
- 更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。
- 使用num <= tar而不是l < r || t < b作为迭代条件,是为了解决当n为奇数时,矩阵中心数字无法在迭代过程中被填充的问题。
- 最终返回 mat 即可。
class Solution {
public:
vector<vector<int>> generateMatrix(int n){
vector<vector<int>> mat(n,vector<int>(n));
int l = 0, r = n - 1, t = 0, b = n - 1;
int num = 1, tar = n * n;
while(num <= tar){
for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
t++;
for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
r--;
for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
b--;
for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
l++;
}
return mat;
}
};
按照「形状」进行模拟
我们可以按「圈」进行构建。
使用「左上角」(x1,y1)&「右下角」(x2,y2) 来确定某个「圈」,进行构建。
完成后,令「左上角」&「右下角」往里收,分别得到 (x1 + 1, y1 + 1) 和 (x2 - 1, y2 - 1),执行相同的构建规则。
class Solution {
void helper(vector<vector<int>> &matrix, int x1, int y1, int x2, int y2, int val){
if(x2 < x1 || y2 < y1){
return;
}
if(x1 == x2){
matrix[x1][y1] = val;
return;
}
for (int i = y1; i < y2; ++i) { matrix[x1][i] = val++; }
for (int i = x1; i < x2; ++i) { matrix[i][y2] = val++; }
for (int i = y2; i > y1; --i) { matrix[x2][i] = val++; }
for (int i = x2; i > x1; --i) { matrix[i][y1] = val++; }
helper(matrix, x1 + 1, y1 + 1, x2 - 1, y2 - 1, val);
}
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> matrix (n, std::vector<int>(n));
helper(matrix, 0, 0, n -1 , n - 1, 1);
return matrix;
}
};
按照「方向」进行模拟
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
std::vector<std::vector<int>> dir {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
std::vector<std::vector<int>> matrix(n, std::vector<int>(n, 0));
int total = n * n, val = 1, x = 0, y = 0, d = 0, tx , ty;
while (total != 0){
matrix[x][y] = val++;
total--;
tx = x + dir[d][0], ty = y + dir[d][1];
if (tx == -1 || ty == -1 || tx == n || ty == n || matrix[tx][ty] != 0){
d = (d + 1) % 4;
tx = x + dir[d][0], ty = y + dir[d][1];
}
x = tx, y = ty;
}
return matrix;
}
};
类似题目
思路 | |
---|---|
54. 顺时针螺旋矩阵 | |
59. 生成螺旋矩阵 |