思想
1. 初始化矩阵
首先,generateMatrix函数通过vector<vector> matrix(n, vector(n, 0))初始化一个大小为n x n的二维矩阵,所有元素初始值设为0。
2. 定义变量
int num = 1; 用于记录当前填充到矩阵中的数字,初始值为1,表示从1开始填充。
int layer = 0; 用于表示当前填充的层级(螺旋的圈数),最外层为0,随着螺旋向内进入下一层,层级增加。
3. 循环填充矩阵
使用while (num <= n * n)循环来填充矩阵,直到所有的元素(从1到n^2)都被填充完毕。
4. 填充每一层
在每一层螺旋中,分四步按顺时针方向填充数字:
从左到右填充上边: for (int i = layer; i < n - layer; ++i) { matrix[layer][i] = num++; } 从当前层级的左上角开始,向右填充到该层级的右上角。
从上到下填充右边: for (int i = layer + 1; i < n - layer; ++i) { matrix[i][n - layer - 1] = num++; } 从当前层级的右上角下一个位置开始,向下填充到该层级的右下角。
从右到左填充下边: for (int i = n - layer - 2; i >= layer; --i) { matrix[n - layer - 1][i] = num++; } 从当前层级的右下角左边一个位置开始,向左填充到该层级的左下角。
从下到上填充左边: for (int i = n - layer - 2; i > layer; --i) { matrix[i][layer] = num++; } 从当前层级的左下角上面一个位置开始,向上填充到该层级的左上角下一个位置(因为左上角的第一个位置已经在填充上边时被填充)。
5. 进入下一层
每完成一层的填充后,通过++layer;进入到下一层螺旋,继续重复上述填充过程。
题目描述:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:1 <= n <= 20
完整代码
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> martix(n, vector<int>(n, 0));
int num = 1;
int layer = 0;
while(num <= n * n){
for(int i = layer; i < n - layer; i++){
martix[layer][i] = num++;
}
for(int i = layer + 1; i < n - layer; i++){
martix[i][n - layer -1] = num++;
}
for(int i = n - layer - 2; i >= layer ; i--){ // 判断条件用layer而不是0,不然到第二层以后会被覆盖掉
martix[n - layer - 1][i] = num++;
}
for(int i = n -layer -2; i > layer; i--){ // 同上
martix[i][layer] = num++;
}
++layer;
}
return martix;
}
};
int main() {
int n;
cin >> n;
Solution s;
vector<vector<int>> matrix = s.generateMatrix(n); // 生成矩阵
// 打印矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
return 0;
}