↓快轉到主要內容
  1. LeetCode/

LeetCode 59: Spiral Matrix II

·1 分鐘· ·
LeetCode Medium Array Matrix Simulation
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-22

  • 提交紀錄:Runtime Error → Wrong Answer → Runtime Error → Accepted ×2

解題思路
#

跟 LC 54 同樣的四個邊界(Matrix 模板四),沿著右、下、左、上的順序,把 1, 2, ..., n² 填進去。正方形每一圈都是完整的,但中間剩一格(n 是奇數)時一樣要靠邊界檢查處理。

我的嘗試
#

當時用了一個從最大的數往回建的技巧:每次在最上面加一列新的 range,再把已經建好的部分順時針轉 90 度。前幾次是起始值算錯(第二版只回傳了 [[1]])和型別錯誤,改對起點才 AC。這個寫法很短但不直覺,上面的邊界模擬比較好解釋。

正確解法
#

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0] * n for _ in range(n)]
        top, bottom, left, right = 0, n - 1, 0, n - 1
        k = 1
        while top <= bottom and left <= right:
            for j in range(left, right + 1):
                res[top][j] = k; k += 1
            top += 1
            for i in range(top, bottom + 1):
                res[i][right] = k; k += 1
            right -= 1
            if top <= bottom:
                for j in range(right, left - 1, -1):
                    res[bottom][j] = k; k += 1
                bottom -= 1
            if left <= right:
                for i in range(bottom, top - 1, -1):
                    res[i][left] = k; k += 1
                left += 1
        return res

複雜度
#

時間 O(n²),空間 O(1)(不算輸出)。

要特別避免的錯誤
#

  • 用 [[0] * n] * n 會讓每一列都是同一個 list。

面試口說整理
#

跟 Spiral Matrix 一樣,我維護上下左右四個邊界,依序往右、下、左、上填數字,每填完一邊就把邊界往內縮。時間 O(n²)。

相關文章

LeetCode 54: Spiral Matrix
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 54 解題筆記:維護上下左右四個邊界,依序走右、下、左、上,每走完一邊就把那個邊界往內縮
LeetCode 36: Valid Sudoku
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 36 解題筆記:每個數字在列、欄、3 × 3 宮格各只能出現一次;用 (數字, 列)、(數字, 欄)、(數字, 宮格) 當 key 放進同一個集合
LeetCode 867: Transpose Matrix
·1 分鐘
LeetCode Easy Array Matrix Simulation
LeetCode 867 解題筆記:轉置後的大小是 n × m,res[j][i] = matrix[i][j];Python 可以用 zip(*matrix)
LeetCode 566: Reshape the Matrix
·1 分鐘
LeetCode Easy Array Matrix Simulation
LeetCode 566 解題筆記:元素總數不同就回傳原矩陣;否則第 k 個元素放到 (k // c, k % c)
LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram