原题 https://leetcode-cn.com/problems/spiral-matrix-ii/
这道题目为 这道题目的升级款版本
https://www.cnblogs.com/wang102030/p/14539838.html
可以沿用上道题目的逆方向思考。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
if n == 0:
return []
if n == 1:
return [[1]]
matrix = list(range(1,n**2+1))
new_matrix = [[0 for _ in range(0,n)] for _ in range(0,n)]
x,y = 0,0
M,N = len(new_matrix),len(new_matrix[0])
dirs = [(0,1),(1,0),(0,-1),(-1,0)]
left,right,up,dowm = 0,N-1,0,M-1
cur_d = 0
for num in matrix:
new_matrix[x][y] = num
if cur_d == 0 and y == right:
cur_d += 1
up += 1
elif cur_d == 1 and x == dowm:
cur_d += 1
right -= 1
elif cur_d == 2 and y == left:
cur_d += 1
dowm -= 1
elif cur_d == 3 and x == up:
cur_d += 1
left += 1
cur_d %= 4
x += dirs[cur_d][0]
y += dirs[cur_d][1]
return new_matrix
个人理解 : 对于这种问题的思考就是,可以一步一步走,碰到边界转化方向。通过 dirs 管理方向 右 下 左 上
边界:下一步坐标小于零或者出了原始矩阵最大值或者是一个非零数字则转化方向。
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
dirs = [(0,1),(1,0),(0,-1),(-1,0)]
count = 0
car_d = 0
x, y =0,0
res = [[0] * n for _ in range(n) ]
while count != n ** 2:
count += 1
res[x][y] = count
dx,dy = dirs[car_d][0],dirs[car_d][1]
newx,newy = x + dx,y +dy # 下一步
# 如果下一步到了边界 转化方向
# 边界定义出了矩阵, 喷到到非零的数字
if newx<0 or newx>= n or newy < 0 or newy >=n or res[newx][newy] != 0:
car_d = (car_d+1) % 4
dx , dy = dirs[car_d][0],dirs[car_d][1]
x ,y = x +dx,y+dy
return res