題目描述
你的面前有一堵矩形的、由 n 行磚塊組成的磚牆。這些磚塊高度相同(也就是一個單位高)但是寬度不同。每一行磚塊的寬度之和應該相等。
你現在要畫一條 自頂向下 的、穿過 最少 磚塊的垂線。如果你畫的線只是從磚塊的邊緣經過,就不算穿過這塊磚。你不能沿着牆的兩個垂直邊緣之一畫線,這樣顯然是沒有穿過一塊磚的。
給你一個二維數組 wall ,該數組包含這堵牆的相關信息。其中,wall[i] 是一個代表從左至右每塊磚的寬度的數組。你需要找出怎樣畫才能使這條線 穿過的磚塊數量最少 ,並且返回 穿過的磚塊數量 。
鏈接:https://leetcode-cn.com/problems/brick-wall
輸入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
輸出:2
示例 2:
輸入:wall = [[1],[1],[1]]
輸出:3
思路
觀察垂直線的特點, 如果穿過每行磚塊對齊的縫隙越多, 那麼穿過磚塊的數量就會越少!
怎麼找到每行的磚塊都恰好對齊的那些縫隙呢?
可以用額外的存儲空間來輔助一下~, 比如 Hashmap
怎麼把計算對齊的縫隙轉化成可操作的代碼呢?
計算每一行磚塊寬度的前綴和! 在計算某一行磚塊的時候, 將磚塊的寬度和進行累計, 每一個累計磚塊的寬度和都作爲 hashmap 的 key, value就是這個key出現的次數.
怎麼求穿過的最少磚塊數?
一個垂直的線最多穿過的磚塊數就是這堵牆的行數, 減去出現次數/頻數最高的磚塊的寬度和, 就相當於找到了磚塊對齊的縫隙最多的那一條垂直線了!
鏈接:https://leetcode-cn.com/problems/brick-wall/solution/chi-xiao-dou-xun-lian-jie-ti-si-lu-rang-wbgfx/
代碼實現
class Solution:
def leastBricks(self, wall: List[List[int]]) -> int:
res = {0: 0}
for lvl in wall:
pos = 0
for brick in lvl[:-1]:
pos += brick
res[pos] = res.get(pos, 0) +1
return len(wall)-max(res.values())