LeetCode-中等 磚牆

題目描述

你的面前有一堵矩形的、由 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())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章