題目來源:https://leetcode-cn.com/problems/surface-area-of-3d-shapespython
在 N * N
的網格上,咱們放置一些 1 * 1 * 1
的立方體。bash
每一個值 v = gridi 表示 v 個正方體疊放在對應單元格 (i, j) 上。微信
請你返回最終形體的表面積。spa
示例 1:3d
輸入:[[2]] 輸出:10
示例 2:code
輸入:[[1,2],[3,4]] 輸出:34
示例 3:blog
輸入:[[1,0],[0,2]] 輸出:16
示例 4:leetcode
輸入:[[1,1,1],[1,0,1],[1,1,1]] 輸出:32
示例 5:get
輸入:[[2,2,2],[2,1,2],[2,2,2]] 輸出:46
思路:作減法it
首先,理解題意。題目要求的在 N * N 的網格中,放置立方體。
先看看題目所給的示例 1 中輸入的內容
輸入:[[2]] 輸出:10
這裏表示,在 1 * 1 的網格中,垂直放置 2 個正方體。
再看示例 2:
輸入:[[1,2],[3,4]] 輸出:34
這裏可能這樣直接看,不太看得出來什麼意思,稍微變更一下:
[ [1, 2], [3, 4] ]
這裏就表示在 2 * 2 的表格中,在對應的單元格中,分別放置 1, 2, 3, 4 個立方體。
理解完題意以後,要考慮堆放立方的時候,可能會出現重疊的部分。只要出現重疊的狀況,就要減去 2 個單位。以下圖所示:
能夠將重疊的狀況分爲上圖所示的三種:
對於垂直重疊這種狀況:
比較好計算,只要當前單元格的立方體的數量大於 1,那麼就會有重疊的部分,重疊部分的數量就是立方體數量減 1。
對於相對行重疊:
由於單元格的立方體有可能大於 1 的狀況,從行的角度出發,立方體可能會有高低之分(如果文字比較難理解,能夠考慮畫圖,將立方體重疊的部分投影到二維平面上)。能夠獲得這個時候從行的角度來看,重疊的部分就是相鄰兩個單元格的值的最小值
對於相對列重疊:
這個狀況跟上面"相對行重疊"的狀況是相似的,從列的角度來看,重疊的部分就是相鄰兩個單元格的值的最小值。
將重疊的狀況羅列出來以後,就能夠在遍歷的時候計算這三種狀況,上面有說起,只要有重疊的部分,那麼就會減去 2 個單位。因此須要計算的有兩部分:
具體實現以下面的代碼。
class Solution: def surfaceArea(self, grid: List[List[int]]) -> int: # 題目給出的是 N * N,這裏默認行列都是 N length = len(grid) cube = 0 # 三個重疊的狀況 vertical_overlap = 0 row_overlap = 0 col_overlap = 0 for i in range(length): for j in range(length): # 計算立方體的個數 cube += grid[i][j] # 考慮垂直重疊的狀況 if grid[i][j] > 1: vertical_overlap += (grid[i][j] - 1) # 考慮相對行重疊的狀況 if j > 0: row_overlap += min(grid[i][j-1], grid[i][j]) # 考慮相對列重疊的狀況 if i > 0: col_overlap += min(grid[i-1][j], grid[i][j]) return cube * 6 - (vertical_overlap + row_overlap + col_overlap ) * 2
以上就是針對《三維形體的表面積》問題,根據作減法的思路,先羅列可能的重疊的狀況,而後在作最後計算的時候減去重疊部分消耗的單位面積進而求得最終解。
歡迎關注微信公衆號《書所集錄》