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

LeetCode 48: Rotate Image

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

基本資料
#

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

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

解題思路
#

順時針旋轉 90 度後,原本的 (i, j) 跑到 (j, n - 1 - i)。拆成兩步(Matrix 模板一):

  1. 轉置:交換 matrix[i][j] 和 matrix[j][i](只交換 j > i 的那一半)。
  2. 每一列左右反轉。

兩步都只用交換,額外空間 O(1)。逆時針則是轉置後上下反轉。

我的嘗試
#

前兩次是參數名稱用錯(A,NameError),之後的 AC 都是 matrix[:] = zip(*matrix[::-1]):先上下反轉再轉置,一行就好,但這其實建了一份新的矩陣,不是題目要的原地旋轉。上面的寫法才是真的 O(1) 空間。

正確解法
#

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        n = len(matrix)
        for i in range(n):
            for j in range(i + 1, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
        for row in matrix:
            row.reverse()

複雜度
#

時間 O(n²),空間 O(1)。

要特別避免的錯誤
#

  • 轉置時只交換一半(j > i),全部交換會換回原樣。
  • matrix[:] = zip(*matrix[::-1]) 雖然能過,但會建新的列(而且每一列是 tuple),不算真正的原地。

面試口說整理
#

順時針轉 90 度等於先轉置再把每一列反轉。轉置時我只交換對角線一邊的元素,接著每一列原地反轉,額外空間 O(1)。

相關文章

LeetCode 417: Pacific Atlantic Water Flow
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Matrix
LeetCode 417 解題筆記:反過來從海邊往內走,只能走到不比自己低的格子;兩個海都走得到的格子就是答案
LeetCode 973: K Closest Points to Origin
·1 分鐘
LeetCode Medium Array Math Divide-and-Conquer Geometry
LeetCode 973 解題筆記:跟 Top-K 一樣,用大小為 k 的 max-heap(存負的距離)保留最近的 k 個點
LeetCode 73: Set Matrix Zeroes
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 73 解題筆記:先記下哪些列、哪些欄有 0,掃完之後再一起改;進階用第一列、第一欄當標記
LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)
LeetCode 54: Spiral Matrix
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 54 解題筆記:維護上下左右四個邊界,依序走右、下、左、上,每走完一邊就把那個邊界往內縮
LeetCode 59: Spiral Matrix II
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 59 解題筆記:跟 LC 54 一樣維護四個邊界,只是把讀取換成依序填入 1 到 n²