给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1 输出:[[1]]
题解和代码:
package day01;
import java.util.Scanner;
public class LeetCode59螺旋矩阵II {
public static void main(String[] args) {
// 创建Scanner对象用于读取控制台输入
Scanner sc = new Scanner(System.in);
// 从控制台读入一个整数n
int n = sc.nextInt();
// 调用generateMatrix方法生成一个n x n的螺旋矩阵
int[][] nums = generateMatrix(n);
// 打印生成的矩阵到控制台
for (int i = 0 ; i < n ; i++) {
for (int j = 0; j < n; j++) {
System.out.print(nums[i][j] + " ");
}
System.out.println(); // 每打印完一行后换行
}
}
/**
* 根据给定的尺寸n生成一个螺旋填充的n x n矩阵
*
* @param n 矩阵的尺寸
* @return 返回一个填充好的螺旋矩阵
*/
public static int[][] generateMatrix(int n) {
// 初始化一个n x n的二维数组
int[][] nums = new int[n][n];
// 初始化偏移量,用于控制每层循环的边界
int offset = 1;
// 初始化计数器,用于填充矩阵中的数字
int count = 1;
// 初始化起始坐标
int startx = 0;
int starty = 0;
int i = startx;
int j = starty;
// 循环次数,决定了外圈的循环次数
int loop = 1;
// 当循环次数小于等于n/2时继续循环
while (loop <= n / 2) {
// 向右填充第一行
for (j = starty; j < n - offset; j++) {
nums[startx][j] = count++;
}
// 向下填充最后一列
for (i = startx; i < n - offset; i++) {
nums[i][j] = count++;
}
// 向左填充最后一行
for (; j > starty; j--) {
nums[i][j] = count++;
}
// 向上填充第一列
for (; i > startx; i--) {
nums[i][j] = count++;
}
// 更新起始坐标和偏移量,并增加循环次数
startx++;
starty++;
offset++;
loop++;
}
// 如果n为奇数,则填充中心位置
if (n % 2 == 1) {
nums[startx][starty] = count;
}
return nums;
}
}