题目
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
提示:
1 <= n <= 20
来源:力扣(LeetCode)
链接: link.
思路
- 创建 res[][]
循环圈的初始位置 x , y
loop 循环圈的个数
count 用来赋值
offset = 1 用于控制循环圈的边的长度的因子 - while ( loop - - ) :
四条边的遍历
更新起始位置
更新 offset - 如果 n 为奇数,则需给矩阵中间的位置赋值
- 返值
具体代码实现(C++)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//1
vector<vector<int>> res(n, vector<int>(n,0)); //创建 res[][]
int x = 0, y = 0; //初始化循环圈的起始位置
int loop = n / 2; //循环圈的个数
int count = 1; //用来赋值
int offset = 1; //用于控制循环圈的边的长度的因子
int i, j;
//2
while (loop--) {
//上行从左到右
for (j = y; j < y + n - offset; j++) {
res[x][j] = count++;
}
//右列从上到下
for (i = x; i < x + n - offset; i++) {
res[i][j] = count++;
}
//下行从右到左
for (; j > y; j--) {
res[i][j] = count++;
}
//左列从下到上
for (; i > x; i--) {
res[i][j] = count++;
}
//更新起始位置
x++;
y++;
//用于控制循环圈的边的长度的因子,每走过一圈边要减去2个长度,这里对应增加2
offset += 2;
}
//3
int mid = n / 2; //矩阵中间的位置
if (n % 2) { //如果 n 为奇数,则需给 mid 赋值
res[mid][mid] = count;
}
//4
return res;
}
};
模型(知识点)
1.< vector<int> > v(m, vector<int>(n) );
功能 : C++ 类似于创建了一个m×n的二维数组,而且可以通过v[i][j]的方式来访问元素(vector支持下标访问元素)。
解析 : 定义了一个vector容器,元素类型为vector,初始化为包含m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。
2.循环不变量原则
解析 : 即循环的边界条件 { 左闭右闭, 左闭右开 …}