题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

解题思路
- 没有具体的算法,考察的是模拟实现过程
- 一圈一圈的循环赋值(当n是奇数的时候,会少一圈,但是中间会有一个空值)
- 坚持循环不变量原则,循环条件:左闭右开(对应的循环条件总是<或者>,没有=)
代码实现
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
//定义一个二维数组
vector<vector<int>> res(n, vector<int>(n, 0));
int startx = 0;
int starty = 0;
int loop = (n / 2); //要循环几圈
int mid = (n / 2); //中间的位置
int offset = 1; //数组下标从0开始,用于控制每次循环一条边的长度
int count = 1; //用于生成1-n的数字
int i,j; //必须全局定义,不然后面有些for里不能使用
//大圈的循环
//n是偶数,循环n/2圈
//n是奇数,循环n/2圈,还留有中间的空
while(loop--){
j = starty;
i = startx;
//第一圈 第一行 左闭右开,第一行最后一个元素不赋值
for(j = starty; j < n - offset; j++){
res[startx][j] = count++; //先是 = count 后是count+1
}
//第一圈 第n列
for( i = startx; i < n - offset; i++){
res[i][j] = count++;
}
//第一圈 第n行
for(; j > starty; j--){
res[i][j] = count++;
}
//第一圈 第一列
for(; i > startx; i--){
res[i][j] = count++;
}
offset += 1;
startx ++;
starty ++;
}
//如果n是奇数,还剩下中间位置
if(n%2){
res[mid][mid] = count;
}
return res;
}
};
浙公网安备 33010602011771号