Appearance
0059-螺旋矩阵II
https://leetcode.cn/problems/spiral-matrix-ii
给你一个正整数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
思路 : 暴力模拟法
根据题目思路,从1开始循环,分四个方向分别计算下一个坐标
参考代码
csharp
public class Solution {
public int[][] GenerateMatrix(int n) {
//初始化数组
int[][] matrix = new int[n][];
for(int i=0; i<n; i++){
matrix[i] = new int[n];
}
//定义四个方向的边界
string direction = "right";
int col = 0;
int row = 0;
for(int i=1; i<=n*n; i++){
//Console.WriteLine("row:{0},col:{1}",row,col);
matrix[row][col] = i;
//计算下一个坐标
if(direction == "right"){
if(col < n-1 && matrix[row][col+1] == 0){
col++;
}
else{
row++;
direction = "down";
}
continue;
}
if(direction == "down"){
if(row < n-1 && matrix[row+1][col] == 0){
row++;
}
else{
col--;
direction = "left";
}
continue;
}
if(direction == "left"){
if(col > 0 && matrix[row][col-1] == 0){
col--;
}
else{
row--;
direction = "up";
}
continue;
}
if(direction == "up"){
if(row > 0 && matrix[row-1][col] == 0){
row--;
}
else{
col++;
direction = "right";
}
}
}
return matrix;
}
}
思路2:按层模拟【官方】

csharp
public class Solution {
public int[][] GenerateMatrix(int n) {
//初始化数组
int[][] matrix = new int[n][];
for(int i=0; i<n; i++){
matrix[i] = new int[n];
}
int left = 0;
int right = n-1;
int top = 0;
int bottom = n-1;
int num = 1;
while(left <= right && top <= bottom ){
//填充第一行
for(int i=left; i<=right; i++){
matrix[top][i] = num;
num++;
}
//填充右边一列
for(int i=top+1; i<=bottom; i++){
matrix[i][right] = num;
num++;
}
//填充底部一列
for(int i=right-1; i>=left; i--){
matrix[bottom][i] = num;
num++;
}
//填充左侧一列
for(int i=bottom-1; i>=top+1; i--){
matrix[i][left] = num;
num++;
}
//收缩范围
left++;
right--;
top++;
bottom--;
}
return matrix;
}
}
思路3,按层计算优化
https://leetcode.cn/problems/spiral-matrix-ii/solution/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/ 处理完直接收缩边界,这样不用再用代码精确控制边界+1,-1
csharp
public class Solution {
public int[][] GenerateMatrix(int n) {
//初始化数组
int[][] matrix = new int[n][];
for(int i=0; i<n; i++){
matrix[i] = new int[n];
}
int left = 0;
int right = n-1;
int top = 0;
int bottom = n-1;
int num = 1;
while(num <= n*n){
//填充第一行
for(int i=left; i<=right; i++){
matrix[top][i] = num;
num++;
}
top++;
//填充右边一列
for(int i=top; i<=bottom; i++){
matrix[i][right] = num;
num++;
}
right--;
//填充底部一列
for(int i=right; i>=left; i--){
matrix[bottom][i] = num;
num++;
}
bottom--;
//填充左侧一列
for(int i=bottom; i>=top; i--){
matrix[i][left] = num;
num++;
}
left++;
}
return matrix;
}
}
AlgoPress