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

LeetCode 3643: Flip Square Submatrix Vertically

·1 分鐘· ·
LeetCode Easy Two-Pointers Matrix
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2025-08-10

  • 提交紀錄:Wrong Answer → Accepted → Accepted(2026-01-24 重打)

解題思路
#

子矩陣的左上角是 (x, y)、邊長 k。上下翻轉就是:子矩陣的第 i 列和倒數第 i 列互換,但只換 y 到 y + k - 1 這一段,矩陣其他部分不動。

用對撞指針:上面的列從 x 往下、下面的列從 x + k - 1 往上,交換 k // 2 次。

我的嘗試:用整個矩陣的最後一列
#

for i in range(x, x + (len(grid) - x) // 2):
    grid[i][y:y + k], grid[-1][y:y + k] = grid[-1][y:y + k], grid[i][y:y + k]

兩個錯誤:

  1. 下面那列寫成 grid[-1],是整個矩陣的最後一列,而且每一次都是同一列,不會隨 i 往上移。
  2. 次數用整個矩陣剩下的列數算,而不是子矩陣的邊長 k。

例如 4 列的矩陣,x = 2、k = 1:子矩陣只有一格,應該完全不變;這一版卻把第 2 列的那一格跟最後一列交換了。

正確解法
#

class Solution:
    def reverseSubmatrix(self, grid: List[List[int]], x: int, y: int, k: int) -> List[List[int]]:
        top, bottom = x, x + k - 1
        while top < bottom:
            grid[top][y:y + k], grid[bottom][y:y + k] = grid[bottom][y:y + k], grid[top][y:y + k]
            top += 1
            bottom -= 1
        return grid

切片賦值 grid[top][y:y + k] = ... 只換掉這一列的那一段,其他欄不受影響。

複雜度
#

時間 O(k^2),空間 O(k)(切片會複製一段)。

要特別避免的錯誤
#

  • 用 grid[-1] 當子矩陣的最後一列。
  • 交換整列而不是只換 y 到 y + k - 1 這一段。

面試口說整理
#

我用兩個指針指向子矩陣的第一列和最後一列,也就是 x 和 x + k - 1,交換這兩列在 y 到 y + k - 1 的那一段,再往中間靠,總共交換 k // 2 次。時間 O(k^2)。

相關文章

LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做
LeetCode 2441: Largest Positive Integer That Exists With Its Negative
·1 分鐘
LeetCode Easy Hash-Map Two-Pointers Sorting
LeetCode 2441 解題筆記:把正數和負數的絕對值分開放兩個 set,取交集的最大值;只用絕對值會把同號的重複數字誤判成一對
LeetCode 1768: Merge Strings Alternately
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 1768 解題筆記:兩個指針輪流取字元,短的用完後接上長的剩下部分
LeetCode 1089: Duplicate Zeros
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 1089 解題筆記:先數有幾個 0 決定每個數要往後移幾格,再從後往前搬,遇到 0 時把複製的那個 0 也寫進去
LeetCode 977: Squares of a Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 977 解題筆記:平方後最大的一定在兩端,左右指針比較兩端的平方,大的從結果的最後面往前填
LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣