59.螺旋矩阵II
59.1 题目
给你一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
59.2 题解
逐层模拟
// 方法一:逐层模拟
// 大致思路和54题一致
// 区别是要创建一个要返回的nxn交错数组,设置行列都为n
// 定义索引用于填充交错数组
static int[][] GenerateMatrix1(int n)
{
// 如果 n 为 1,直接返回一个包含 1 的二维数组
if (n == 1)
{
return new int[][] { new[] { 1 } };
}
// 创建一个 n x n 的二维数组
int[][] resultMatrix = new int[n][];
// 初始化二维数组的每一行
for (int i = 0; i < n; i++)
{
resultMatrix[i] = new int[n];
}
// 初始化四个边界指针,表示当前螺旋填充的上、下、左、右边界
int top = 0;
int left = 0;
int right = n - 1;
int bottom = n - 1;
// 初始化当前要填充的数字
int nowVal = 1;
// 当上边界小于等于下边界且左边界小于等于右边界时,继续填充
while (top <= bottom && left <= right)
{
// 从左到右填充当前行
for (int i = left; i <= right; i++)
{
resultMatrix[top][i] = nowVal++;
}
// 从上到下填充当前列
for (int i = top + 1; i <= bottom; i++)
{
resultMatrix[i][right] = nowVal++;
}
// 检查是否有足够的行和列使得可以从右到左填充
if (left < right && top < bottom)
{
// 从右到左填充当前行
for (int i = right - 1; i >= left; i--)
{
resultMatrix[bottom][i] = nowVal++;
}
// 从下到上填充当前列
for (int i = bottom - 1; i > top; i--)
{
resultMatrix[i][left] = nowVal++;
}
}
// 更新边界指示器,缩小螺旋填充范围
top++;
left++;
bottom--;
right--;
}
// 返回生成的二维数组
return resultMatrix;
}
59.3 代码
using System;
using System.Collections.Generic;
using System.Security.Principal;
class Program
{
static void Main()
{
#region 题目
// 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
// 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
// 示例 1:
// 输入:n = 3
// 输出:[[1,2,3],[8,9,4],[7,6,5]]
// 示例 2:
// 输入:n = 1
// 输出:[[1]]
#endregion
#region 测试
// 示例 1
int n1 = 3;
int[][] resultMatrix1 = GenerateMatrix1(n1);
Console.WriteLine($"示例1 方法1 输出:");
PrintMatrix(resultMatrix1);
// 示例 2
int n2 = 1;
int[][] resultMatrix2 = GenerateMatrix1(n2);
Console.WriteLine($"示例2 方法1 输出:");
PrintMatrix(resultMatrix2);
#endregion
}
#region 答案
// 方法一:逐层模拟
// 大致思路和54题一致
// 区别是要创建一个要返回的nxn交错数组,设置行列都为n
// 定义索引用于填充交错数组
static int[][] GenerateMatrix1(int n)
{
// 如果 n 为 1,直接返回一个包含 1 的二维数组
if (n == 1)
{
return new int[][] { new[] { 1 } };
}
// 创建一个 n x n 的二维数组
int[][] resultMatrix = new int[n][];
// 初始化二维数组的每一行
for (int i = 0; i < n; i++)
{
resultMatrix[i] = new int[n];
}
// 初始化四个边界指针,表示当前螺旋填充的上、下、左、右边界
int top = 0;
int left = 0;
int right = n - 1;
int bottom = n - 1;
// 初始化当前要填充的数字
int nowVal = 1;
// 当上边界小于等于下边界且左边界小于等于右边界时,继续填充
while (top <= bottom && left <= right)
{
// 从左到右填充当前行
for (int i = left; i <= right; i++)
{
resultMatrix[top][i] = nowVal++;
}
// 从上到下填充当前列
for (int i = top + 1; i <= bottom; i++)
{
resultMatrix[i][right] = nowVal++;
}
// 检查是否有足够的行和列使得可以从右到左填充
if (left < right && top < bottom)
{
// 从右到左填充当前行
for (int i = right - 1; i >= left; i--)
{
resultMatrix[bottom][i] = nowVal++;
}
// 从下到上填充当前列
for (int i = bottom - 1; i > top; i--)
{
resultMatrix[i][left] = nowVal++;
}
}
// 更新边界指示器,缩小螺旋填充范围
top++;
left++;
bottom--;
right--;
}
// 返回生成的二维数组
return resultMatrix;
}
#endregion
#region 辅助函数
// 打印矩阵
static void PrintMatrix(int[][] matrix)
{
foreach (var row in matrix)
{
Console.Write("[");
// 使用 Join 方法将每个数字连接起来,逗号分隔
Console.Write(string.Join(", ", row));
Console.WriteLine("]");
}
}
#endregion
}
59.4 运行结果
示例1 方法1 输出:
[1, 2, 3]
[8, 9, 4]
[7, 6, 5]
示例2 方法1 输出:
[1]
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com