#1、892. 三维形体的表面积难度简单85在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#2、思路
1、想到投影,但是错了,
2、一个块6个面,减去重影就好了, 重影从3个角度减去
3、 盖住的那个面,和谁一起计算?? 和后边那个一起计算!!!,总是能分的清的
一个柱体一个柱体的看就好了,一个柱体增加的表面积4*个数 + 2 ,
当从(0, 0)开始往后堆积的时候,只需要减去和左边 i-1 那个柱面的重影,
再减去和前边 j-1 的那个柱面的重影
#3、notes
1、不能整体的时候,就拆开试试
#4、复杂度
时间: O(n2)
空间: O (1)
#5、code
思路2的代码:
class Solution { public int surfaceArea(int[][] grid)
{
if(grid == null || grid.length < 1 || grid[0].length < 1)
return 0;
//统计所有的立方体数量
int blocks = 0;
//统计有多少个面被其他面盖住,那么就在所有的立方体的表面积上减去被盖住的面数×2
//( 因为盖住一个面需要另一个面 来盖,所以会损失2个面);
int cover = 0;
for(int i = 0;i < grid.length;++i)
{
for(int j = 0; j < grid[0].length;++j)
{
blocks += grid[i][j];
//这个是统计当前格子中因为堆叠而盖住了几个面
cover += grid[i][j] > 1 ? grid[i][j] -1 : 0;
if(i > 0)
{
//看看上一行同一列盖住了多少个面
cover += Math.min(grid[i-1][j],grid[i][j]);
}
if(j > 0)
{
//看看同一行前一列盖住了几个面
cover += Math.min(grid[i][j-1],grid[i][j]);
}
}
}
return blocks * 6 - cover * 2;
}
}
思路3:
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int n=grid.size();
int t=0;
int res=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
t=grid[i][j];
if(t>0)
{
res+=2+t*4; // 一个柱面贡献四周和上下底面
if(i>0)
res-=2*min(grid[i-1][j],t); //如果是行i往后了,就会有行的接触面,
if(j>0)
res-=2*min(grid[i][j-1],t); //如果是列j往后了,就会有列的接触面,
}
}
}
return res;
}
};