# 59. Spiral Matrix II https://leetcode.com/problems/spiral-matrix-ii/description/ ###### tags: `Python`,`Leetcode` ## Code ``` python = class Solution: def generateMatrix(self, n: int) -> List[List[int]]: mat = [[0] * n for i in range(n)] def dfs(r,c): global start if r >= n or r < 0 or c >= n or c < 0 or mat[r][c] != 0: return mat[r][c] = start start += 1 if c+1 >= r: dfs(r,c+1) dfs(r+1,c) dfs(r,c-1) dfs(r-1,c) global start start = 1 dfs(0,0) return mat ``` ## 題意 * 題目會給一個 `n` ,接著我們要依螺旋順序把數字 `1` ~ `n*n` 放進大小為 `n*n` 的矩陣中 * **Example**: ``` Input: n = 3 Output: [[1,2,3],[8,9,4],[7,6,5]] ``` ## 思路 * 這種走到底就轉彎的路徑讓我想到 DFS ,就用 DFS 做看看 * 但這種做法其實 Runtime 表現上不是上佳,大家參考看看就好 ## 解法 ``` python = class Solution: def generateMatrix(self, n: int) -> List[List[int]]: mat = [[0] * n for i in range(n)] # 表達式 A = [[0] * n for _ in range(n)] 會創建一個大小為 n x n 的二維列表,其中每個元素都是 0 # 表達式 A = [[0] * n] * n 則會創建一個大小為 n x n 的二維列表,其中每一行都是指向同一個列表對象的引用(指到同一塊記憶體) 。這意味著如果修改其中一行的元素,其他行的相應元素也會被修改 def dfs(r,c): global start # 全局變量 start 記錄當前填充的元素值 if r >= n or r < 0 or c >= n or c < 0 or mat[r][c] != 0: # 如果搜索到邊界,或者當前位置已經被填充,則返回 # 這個 mat[r][c] != 0 條件要放在最後,因為若超過邊界(r,c > n),會導致 out of index return mat[r][c] = start # 走到的那一格填入數字 start += 1 # 下一個數字 = 現在的數字 + 1 if c+1 >= r:# 如果沒有這個判斷式,往右往下往上走後發現往右還有路走 ➡️ 沒辦法乖乖往上走到底 # c + 1 >= r 算是一個歸納出來的結果 dfs(r,c+1) # 往右走 dfs(r+1,c) # 往下走 dfs(r,c-1) # 往左走 dfs(r-1,c) # 往上走 global start start = 1 # 定義全局變量 start,並初始化為 1 dfs(0,0) return mat ``` ## 解法 2 * 問了一下 ChatGPT,請他使用 DFS 解這題,出現了一個我覺得蠻可愛的解法,提供給大家參考 * Runtime 還不錯,就是有點耗記憶體 ``` python= class Solution: def generateMatrix(self, n: int) -> List[List[int]]: mat = [[0] * n for _ in range(n)] num = 1 def dfs(r, c, direction): nonlocal num if num > n * n: return if mat[r][c] == 0: mat[r][c] = num num += 1 if direction == 0: # 向右 if c < n - 1 and mat[r][c + 1] == 0: dfs(r, c + 1, 0) else: dfs(r + 1, c, 1) elif direction == 1: # 向下 if r < n - 1 and mat[r + 1][c] == 0: dfs(r + 1, c, 1) else: dfs(r, c - 1, 2) elif direction == 2: # 向左 if c > 0 and mat[r][c - 1] == 0: dfs(r, c - 1, 2) else: dfs(r - 1, c, 3) else: # 向上 if r > 0 and mat[r - 1][c] == 0: dfs(r - 1, c, 3) else: dfs(r, c + 1, 0) dfs(0, 0, 0) return mat ```