【Leetcode】883. 三維形體投影面積
阿新 • • 發佈:2018-12-14
題目描述:
在 N * N
的網格中,我們放置了一些與 x,y,z 三軸對齊的 1 * 1 * 1
立方體。
每個值 v = grid[i][j]
表示 v
個正方體疊放在單元格 (i, j)
上。
現在,我們檢視這些立方體在 xy、yz 和 zx 平面上的投影。
投影就像影子,將三維形體對映到一個二維平面上。
在這裡,從頂部、前面和側面看立方體時,我們會看到“影子”。
返回所有三個投影的總面積。
示例 1:
輸入:[[2]]
輸出:5
示例 2:
輸入:[[1,2],[3,4]]
輸出:17
解釋:
這裡有該形體在三個軸對齊平面上的三個投影(“陰影部分”)。
示例 3:
輸入:[[1,0],[0,2]]
輸出:8
示例 4:
輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:14
示例 5:
輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:21
提示:
1 <= grid.length = grid[0].length <= 50
0 <= grid[i][j] <= 50
解題思路:
本題和之前做過的【807. 保持城市天際線】 問題很相似,本題是找三檢視的面積,分別分成三個面來求解,
俯視:只要在網格位置上放置了立方體,向下投影的面積都是1,所以只需要區分有沒有網格上放置立方體。
前視:找到對應列立方體最高的投影面積和(即每列最大值之和)。
左視:與前視原理一致。找到對應行立方體最高的投影面積和(即每列最大值之和)。
AC程式碼:
class Solution { public: int projectionArea(vector<vector<int>>& grid) { //button int btonNums = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j]>0) btonNums++; } } //font int fontNums = 0; for (int i = 0; i < grid.size(); i++) { int Rmax = 0; for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j]>Rmax) Rmax = grid[i][j]; } fontNums += Rmax; } //left int leftNums = 0; for (int j = 0; j < grid.size(); j++) { int Cmax = 0; for (int i = 0; i < grid[0].size(); i++) { if (grid[i][j]>Cmax) Cmax = grid[i][j]; } leftNums += Cmax; } return btonNums + fontNums + leftNums; } };