原題
這道題目為 這道題目的公升級款版本
可以沿用上道題目的逆方向思考。
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
力扣 059 螺旋矩陣 II
給定乙個正整數 n,生成乙個包含 1 到 n 2n 2 n2所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 這是經典的陣列題,題目看起來簡單,但做起來的時候,很容易因為邊界的問題搞到自己十分混亂。這裡我推薦一下我的做法,首先是按圈來排列數字...
59 螺旋矩陣 II
給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 class solution for int i 0 i 2 num 1 i 如果不是第乙個圈,個數需要減少1 if x 1 else r1 n...
59 螺旋矩陣 II
一輪 四種遍歷 後,將座標更新到新一輪的初始位置 x 1 y 1 初始步長 step n 1,之後更新步長 step 2 n為奇數時,最後四種遍歷完之後,再新增處於最中間的數 class solution def generatematrix self,n int list list int res...