前往
大廳
主題

LeetCode - 0807. Max Increase to Keep City Skyline 解題心得

Not In My Back Yard | 2024-04-29 12:00:12 | 巴幣 0 | 人氣 41

題目連結:


題目意譯:
現在有一座城市有著 n × n 個街區,其中每一個街區包含著一座建築物,其形狀為一個鉛直的方柱。你被給定一個索引值從 0 開始數且大小為 n × n 的整數矩陣 grid,其中 grid[r][c] 代表著在第 r 列第 c 行的那一塊街區上的建築物之高度。

一道天際線為從一段距離從「旁側」望向城市中所有建築物所形成的外部輪廓。從羅盤方位上的北東南西望向城市的各個天際線可能有所不同。

而我們被允許來為任意個建築物增加任意量的高度(增加的量可以每棟不同)。一個高度為 0 建築物之高度也可以被增加。但是以上的前提是,每次將建築物的高度變高時,從任一羅盤方位望向城市的天際線都不得有所變動。

回傳在不更動從任一羅盤方位望向城市的天際線的情況下,最大可以為這些建築物增加的高度總量。

限制:
n == grid.length
n == grid[r].length
2 ≦ n ≦ 50
0 ≦ grid[r][c] ≦ 100



範例測資:
範例 1:
輸入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
輸出: 35
解釋: 上圖的中間區域表示了建築物的高度。
從各個羅盤方位上望向城市的天際線以紅色標記。
在不更動天際線的情況下經過高度增加之後的新 grid 為:
gridNew = [ [8, 4, 8, 7],
            [7, 4, 7, 7],
            [9, 4, 8, 7],
            [3, 3, 3, 3] ]

範例 2:
輸入: grid = [[0,0,0],[0,0,0],[0,0,0]]
輸出: 0
解釋: 將任一棟建築物增加高度都會使得天際線有所變化。


解題思維:
為了不更動天際線,這代表著對於每一個建築物而言,其不得將高度增加到超過同一列(對應於東西方位)的建築物高度的最大值;同時也不得將高度增加到超過同一行(對應於南北方位)的建築物高度的最大值。

因此我們可以先掃過一次 grid 來找到每一列和每一行各自的高度最大值。然後再掃過一次 grid 來判斷每一棟建築物最大可以增加多少高度。而一棟位於第 i 列第 j 行的建築物,其最大可增加高度為
min(第 i 列高度最大值, 第 j 行高度最大值)
所有建築物的最大可增加量之總和即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作