【Leetcode】892. 三維形體的表面積
阿新 • • 發佈:2018-11-26
題目描述:
在 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]]
輸出:16
示例 4:
輸入:[[1,1,1],[1,0,1],[1,1,1]] 輸出:32
示例 5:
輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
解題思路:
之前做過【883.三維投影面積】,本來以為x2就好了,但是事情並沒那麼簡單(^_^)。因為投影會有遮擋部分的表面積不計算,所以使用投影的方法行不通了,那就只能一個一個的去統計了。這時,我們就會發現:
表面積=每個立方體面積-接觸面面積=立方體個數*6-接觸面個數*2;
這樣的話,我們就只用分別統計小立方體個數和接觸的個數了。
AC程式碼:
class Solution { public: int surfaceArea(vector<vector<int>>& grid) { int count = 0; int contact = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { //Total number of cubes count += grid[i][j]; //button contact areas number if (grid[i][j] > 1) { contact += grid[i][j] - 1; } //right contact areas number if ((j < (grid[0].size() - 1)) && (grid[i][j + 1] != 0)) { contact += min(grid[i][j + 1], grid[i][j]); } //font contact areas number if ((i < (grid.size() - 1)) && (grid[i + 1][j] != 0)) { contact += min(grid[i + 1][j], grid[i][j]); } } } return count * 6 - contact * 2; } };