力扣地址: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]]
方法1
Python
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
matrix = [[0] * n for _ in range(n)] # 结果矩阵
startx, starty = 0, 0 # 起始坐标
loop = n // 2 # 绕的圈数
cnt = 1 # 放入matrix的值
# 每绕一圈偏移量增加1,偏移量从1开始
for offset in range(1, loop + 1):
for j in range(starty, n - offset): # 从左至右,左闭右开
matrix[startx][j] = cnt
cnt += 1
for i in range(startx, n - offset): # 从上至下,上闭下开
matrix[i][n - offset] = cnt
cnt += 1
for j in range(n - offset, starty, -1): # 从右至左,右闭左开
matrix[n - offset][j] = cnt
cnt += 1
for i in range(n - offset, startx, -1): # 从下至上,下闭上开
matrix[i][starty] = cnt
cnt += 1
# 更新起始点
startx += 1
starty += 1
if n % 2 == 1: # n为奇数时,填充中心点
matrix[n // 2][n // 2] = cnt
return matrix
Java
class Solution {
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n]; // 结果矩阵
int startx = 0, starty = 0; // 起始坐标
int loop = n / 2; // 绕的圈数
int cnt = 1; // 放入matrix的值
// 每绕一圈偏移量增加1,偏移量从1开始
for (int offset = 1; offset <= loop; offset++) {
// 从左至右(左闭右开)
for (int j = starty; j < n - offset; j++) {
matrix[startx][j] = cnt++;
}
// 从上至下(上闭下开)
for (int i = startx; i < n - offset; i++) {
matrix[i][n - offset] = cnt++;
}
// 从右至左(右闭左开)
for (int j = n - offset; j > starty; j--) {
matrix[n - offset][j] = cnt++;
}
// 从下至上(下闭上开)
for (int i = n - offset; i > startx; i--) {
matrix[i][starty] = cnt++;
}
// 更新起始点
startx++;
starty++;
}
if (n % 2 == 1) { // n为奇数时,填充中心点
matrix[n / 2][n / 2] = cnt;
}
return matrix;
}
}
方法2
Python
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# 模拟过程
# 难度:☆☆☆☆
directions = ((0, 1), (1, 0), (0, -1), (-1, 0)) # 右下左上
matrix = [[0] * n for _ in range(n)] # 结果矩阵
# i, j 是要填入到matrix时,matrix的索引
# di是directions的索引,代表方向,在不断走时,到了边界就+1换方向即右转90度
# di=0时是向右;di=1时是向下;di=2时是向左;di=3时是向上
i = j = di = 0
for val in range(1, n * n + 1):
# val是要填入到matrix的值,采用for循环方法获得
matrix[i][j] = val
x, y = i + directions[di][0], j + directions[di][1]
# 如果 (x, y) 出界或者已经填入数字,转向
if x < 0 or x >= n or y < 0 or y >= n or matrix[x][y]:
di = (di + 1) % 4 # 每次转向就是di+1,但是到了3时,再转就要再到0,所以需要用%取余数
i += directions[di][0]
j += directions[di][1]
return matrix
Java
class Solution {
public int[][] generateMatrix(int n) {
// 模拟过程
// 难度:☆☆☆☆
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
int[][] matrix = new int[n][n]; // 结果矩阵
int i = 0, j = 0, di = 0;
for (int val = 1; val <= n * n; val++) {
matrix[i][j] = val;
int x = i + directions[di][0];
int y = j + directions[di][1];
if (x < 0 || x >= n || y < 0 || y >= n || matrix[x][y] != 0) {
di = (di + 1) % 4;
}
i += directions[di][0];
j += directions[di][1];
}
return matrix;
}
}