三维形体的表面积
在 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]的位置有1个正方体,在grid[0][1]的位置有2个正方体,在grid[1][0]的位置有3个正方体在grid[1][1]的位置有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
class Solution { public: int surfaceArea(vector<vector<int>>& grid) { int num = 0; int numContact = 0; for(int i = 0; i < grid.size(); i++){ for(int j = 0; j < grid[i].size(); j++){ num += grid[i][j]; if(grid[i][j] != 0) numContact += grid[i][j]-1; if(i != 0){ numContact += min(grid[i-1][j],grid[i][j]); } if(j != 0){ numContact += min(grid[i][j-1], grid[i][j]); } } } return num*6 - numContact*2; } };
解题思路:每个正方体的面有6个,每接触1下,就会消耗2个面。因此只要计算出有多少个正方体,以及有多少个面有接触就好了。
其中接触面有两种情况:(1)同一个位置堆叠起来的正方体,其消耗的面个数为grid[i][j]-1(2)与左边或上边的立方体接触,消耗的面个数为两者的立方体个数最小值。