螺旋矩阵 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
代码结果
运行时间: 52 ms, 内存: 14.9 MB
/*
* 题目思路:
* 1. 使用流来生成螺旋矩阵较为复杂,因为流操作通常是单向的。这里我们仍然需要一个可变数据结构来存储矩阵的元素。
* 2. 使用一个二维数组存储结果,并使用基本的数组操作来构建矩阵,同时将流的功能主要用于输出或处理结果。
*/
import java.util.Arrays;
import java.util.stream.Collectors;
public class Solution {
public static int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int num = 1, top = 0, bottom = n - 1, left = 0, right = n - 1;
while (num <= n * n) {
// 从左到右
for (int i = left; i <= right; i++) {
matrix[top][i] = num++;
}
top++;
// 从上到下
for (int i = top; i <= bottom; i++) {
matrix[i][right] = num++;
}
right--;
// 从右到左
for (int i = right; i >= left; i--) {
matrix[bottom][i] = num++;
}
bottom--;
// 从下到上
for (int i = bottom; i >= top; i--) {
matrix[i][left] = num++;
}
left++;
}
return matrix;
}
public static void main(String[] args) {
int n = 3;
int[][] matrix = generateMatrix(n);
System.out.println(Arrays.stream(matrix)
.map(Arrays::toString)
.collect(Collectors.joining(",\n")));
}
}
解释
方法:
这个题解采用了模拟螺旋填充的方式来生成矩阵。通过控制矩阵的上下左右边界,依次填充矩阵的外围元素。具体步骤如下:
1. 初始化一个 n x n 的矩阵,元素全部为0。
2. 初始化矩阵的上下左右边界 u、d、l、r。
3. 从左到右填充上边界,更新上边界 u。
4. 从上到下填充右边界,更新右边界 r。
5. 从右到左填充下边界,更新下边界 d。
6. 从下到上填充左边界,更新左边界 l。
7. 重复步骤3-6,直到填充完整个矩阵。
时间复杂度:
O(n^2)
空间复杂度:
O(n^2)
代码细节讲解
🦆
在初始化矩阵时,为什么选择将所有元素设为0,而不是其他默认值?
▷🦆
在填充过程中,更新边界的操作比如`u += 1`或`r -= 1`是如何确保不会导致边界交叉,从而避免覆盖已填充的元素?
▷🦆
题解中提到,当`u > d`或`l > r`时循环会中断,这种边界条件是如何确定的,它们能完全覆盖所有可能的情况吗?
▷🦆
在函数返回值前没有进行任何额外的检查或调整,这是否意味着算法对所有有效输入(1 <= n <= 20)都能正确工作?
▷