日期:2026年8月21日
LeetCode 題目連結:554. Brick Wall
解題想法
中等難度題。題目給一個 $n$ 列的二維陣列 $wall$,每一列代表這列之中由左到右每個磚塊的寬度,題目假設要從地面往上畫一條鉛直線,這條線穿過的磚塊數量最少為幾塊。這題要反過來寫,先找出磚塊之間的接縫位置,計算接縫位置的數量,答案就是 $n$ 減去接縫數量的最小值。由於每列的總寬度極大,但是接縫數量不會太大,很適合用字典計數。用 C++ 解題要注意,接縫的位置會超出 int 的上限,要用 long 才不會溢位。
Python 程式碼
使用預設的 dict。Runtime: 3 ms, beats 93.16%. Memory: 22.97 MB, beats 22.08%.
class Solution:
def leastBricks(self, wall: List[List[int]]) -> int:
n = len(wall) # n 列磚塊
psum = dict() # 磚塊接縫的位置及次數
for w in wall:
pos = 0
for x in w[:-1]: # 不含整列的最右側
pos += x
if pos not in psum:
psum[pos] = 1
else:
psum[pos] += 1
# 答案為 n - 出現最多次的接縫位置
return n if not psum.values() else n - max(psum.values())
使用 collections.defaultdict。Runtime: 7 ms, beats 70.30%. Memory: 22.92 MB, beats 22.08%.
class Solution:
def leastBricks(self, wall: List[List[int]]) -> int:
n = len(wall) # n 列磚塊
psum = defaultdict(int) # 磚塊接縫的位置及次數
for w in wall:
pos = 0
for x in w[:-1]: # 不含整列的最右側
pos += x
psum[pos] += 1
# 答案為 n - 出現最多次的接縫位置
return n if not psum.values() else n - max(psum.values())