59.螺旋矩阵 II
标签: array
, math
难度: Medium
通过率: 72.55%
原题链接: https://leetcode.com/problems/spiral-matrix-ii/description/
题目描述
给定一个正整数 ,生成一个 的矩阵,其中元素从 到 以螺旋顺序填充。
解题思路
我们可以使用逐步向内填充的方式来生成螺旋形矩阵。具体地说:
-
初始化一个 的空矩阵
matrix
,用0
填充。 -
使用
current_num
跟踪要放入矩阵中的下一个数字,初始化为 1。 -
定义四个边界来限制螺旋的方向:
top
、bottom
、left
和right
,分别从0、、0 和 初始化。 -
使用一个循环,在
current_num
小于等于 时循环:- 从
left
到right
,遍历top
行,并将current_num
放入矩阵相应位置,current_num
递增,然后top
增加 1。 - 从
top
到bottom
,遍历right
列,并将current_num
放入矩阵相应位置,current_num
递增,然后right
减少 1。 - 从
right
到left
,遍历bottom
行,并将current_num
放入矩阵相应位置,current_num
递增,然后bottom
减少 1。 - 从
bottom
到top
,遍历left
列,并将current_num
放入矩阵相应位置,current_num
递增,然后left
增加 1。
- 从
-
最终,返回矩阵
matrix
。
代码实现
- Python
- C++
- JavaScript
- Java
def generateMatrix(n):
# 初始化一个 n x n 的矩阵
matrix = [[0] * n for _ in range(n)]
# 初始化起始数字
current_num = 1
# 定义边界
top, bottom, left, right = 0, n - 1, 0, n - 1
while current_num <= n * n:
# 从左到右遍历上边界
for i in range(left, right + 1):
matrix[top][i] = current_num
current_num += 1
top += 1
# 从上到下遍历右边界
for i in range(top, bottom + 1):
matrix[i][right] = current_num
current_num += 1
right -= 1
# 从右到左遍历下边界
for i in range(right, left - 1, -1):
matrix[bottom][i] = current_num
current_num += 1
bottom -= 1
# 从下到上遍历左边界
for i in range(bottom, top - 1, -1):
matrix[i][left] = current_num
current_num += 1
left += 1
return matrix
vector<vector<int>> generateMatrix(int n) {
// 初始化 n x n 的矩阵
vector<vector<int>> matrix(n, vector<int>(n, 0));
// 初始化起始数字
int current_num = 1;
// 定义边界
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (current_num <= n * n) {
// 从左到右遍历上边界
for (int i = left; i <= right; ++i) {
matrix[top][i] = current_num++;
}
++top;
// 从上到下遍历右边界
for (int i = top; i <= bottom; ++i) {
matrix[i][right] = current_num++;
}
--right;
// 从右到左遍历下边界
for (int i = right; i >= left; --i) {
matrix[bottom][i] = current_num++;
}
--bottom;
// 从下到上遍历左边界
for (int i = bottom; i >= top; --i) {
matrix[i][left] = current_num++;
}
++left;
}
return matrix;
}
function generateMatrix(n) {
// 初始化 n x n 的矩阵
const matrix = Array.from({ length: n }, () => Array(n).fill(0));
// 初始化起始数字
let current_num = 1;
// 定义边界
let top = 0, bottom = n - 1, left = 0, right = n - 1;
while (current_num <= n * n) {
// 从左到右遍历上边界
for (let i = left; i <= right; i++) {
matrix[top][i] = current_num++;
}
top++;
// 从上到下遍历右边界
for (let i = top; i <= bottom; i++) {
matrix[i][right] = current_num++;
}
right--;
// 从右到左遍历下边界
for (let i = right; i >= left; i--) {
matrix[bottom][i] = current_num++;
}
bottom--;
// 从下到上遍历左边界
for (let i = bottom; i >= top; i--) {
matrix[i][left] = current_num++;
}
left++;
}
return matrix;
}
public int[][] generateMatrix(int n) {
// 初始化 n x n 的矩阵
int[][] matrix = new int[n][n];
// 初始化起始数字
int current_num = 1;
// 定义边界
int top = 0, bottom = n - 1, left = 0, right = n - 1;
while (current_num <= n * n) {
// 从左到右遍历上边界
for (int i = left; i <= right; i++) {
matrix[top][i] = current_num++;
}
top++;
// 从上到下遍历右边界
for (int i = top; i <= bottom; i++) {
matrix[i][right] = current_num++;
}
right--;
// 从右到左遍历下边界
for (int i = right; i >= left; i--) {
matrix[bottom][i] = current_num++;
}
bottom--;
// 从下到上遍历左边界
for (int i = bottom; i >= top; i--) {
matrix[i][left] = current_num++;
}
left++;
}
return matrix;
}
复杂度分析
时间复杂度:,因为我们必须填充 个单元格。空间复杂度:,除了用于存储结果的矩阵,不需要额外的空间。