在n * n
的網格上,我們放置一些1 * 1 * 1
的立方體。每個值
v = grid[i][j]
表示v
個正方體疊放在對應單元格(i, j)
上。請你返回最終形體的表面積。
輸入示例:[[1,1,1],[1,0,1],[1,1,1]]
輸出示例:32
c++函式形式: int
su***cearea
(vector
int>>
& grid)
初一看,這個問題似乎有點複雜,因為一些正方體重疊起來會產生非常多的重疊空間,我們怎麼去去掉這些重複的面積呢,或者,我怎麼知道到底有沒有重複呢?
我們先來看乙個圖:
怎麼樣,是不是發現沒有任何思路。
別怕,我們先找乙個標誌,然後慢慢的去清理去重的思路。
很容易發現,當乙個格仔上有n
個正方體的時候,我們一共產生了兩個底面(上底面和下底面),n*4
個側面,總共就是n*4+2
的面積,這是不考慮重複的情況。
首先,我們要清楚,每乙個格仔上產生的重疊,和哪些格仔有關,沒錯,就是上下左右,四個都有關,而且是在矩陣中,最開始的那部分的左邊和上邊肯定不要考慮,快要結束的那部分右邊和下邊不要考慮,我們怎樣做到遍歷一遍,就能統一乙個標準,去掉所有的重複呢?
那就是對每乙個格仔只考慮左邊和上邊產生的影響,最開始的不考慮,因為通過遍歷,它的右邊和下邊,最終會成為其它格仔的左邊和上邊,而去重只需要去一次,而且這樣最靠近末尾的部分的右邊和下邊不要考慮,因為沒有重疊。
重疊的面積就是兩個共同有的,也就是由最矮的那個格仔決定的,是最矮格仔的兩倍,也就是min(v1,v2)*2
。
到這裡,我們就只需要一次遍歷就可以求出來了。
class
solution
}return ans;}}
;
atfwus --writing by 2020–03–25
三維形體的表面積
三維形體的表面積 93min 在 n n 的網格上,我們放置一些 1 1 1 的立方體。每個值 v grid i j 表示 v 個正方體疊放在對應單元格 i,j 上。請你返回最終形體的表面積。示例 1 輸入 2 輸出 10 示例 2 輸入 1,2 3,4 輸出 34 示例 3 輸入 1,0 0,2 ...
三維形體的表面積
在 n n 的網格上,我們放置一些 1 1 1 的立方體。每個值 v grid i j 表示 v 個正方體疊放在對應單元格 i,j 上。請你返回最終形體的表面積。示例 1 輸入 2 表示在grid 0 0 的位置有2個正方體 輸出 10 示例 2 輸入 1,2 3,4 表示在grid 0 0 的位置...
leetcode三維形體的表面積
對於grid i,j 設其值為val,則單獨考慮當前元素,其貢獻的表面積為4 val 2 但是,gird i,j 可能和其他元素挨著,當挨著時,對於接觸的表面,要減去其表面積 對grid i,j 有上下左右四個方向可能有接觸,但我們只需要考慮上和左兩個方向,右和下放到後面的元素去考慮。即對grid ...