题目

难度:★★☆☆☆

类型:几何、数学、二维数组

在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。

每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。

返回最终形体的表面积。

提示

1 <= N <= 50

0 <= grid[i][j] <= 50

示例

示例 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

解答

这道题与【题目463. 岛屿的周长】属于同一类,相当于将二维扩展到了三维。

循环。由于题目已经告知我们,搜索范围是50*50的方格(grid),因此我们可以遍历每一个方格,查看这些方格上是否存在四棱柱。

表面积的处理。这是这个问题的重点和难点,当某一个正方形(grid[i][j])上存在四棱柱时,四棱柱的上下底面是无法被遮挡的,因此最终结果一定包含上下底面,可能被遮挡的部分只有四个方向的侧面,如果侧面相邻位置存在棱柱,那么当前棱柱肯定会有一部分表面被遮挡起来,且遮挡的面积取决于两者的高度。

我们计算当前棱柱grid[i][j]贡献的表面积:

底面:首先将两个底面的面积加入结果中:ans=ans+2;

侧面:四个相邻位置(i+1, j), (i-1, j), (i, j+1), (i, j-1)分别考虑,如果其中一个位置存在高度为h的棱柱,那么当前高为grid[i][j]的棱柱被遮挡的部分高度为min(h, grid[i][j]),贡献了grid[i][j]-min(h, grid[i][j])=max(0, grid[i][j]-h)的表面积,其中h既是相邻棱柱的高度,也可以认为是两者接触面的面积,我们定义为concat。

例如[[1,5]],表示[0, 0]方格上放一个高度为1的棱柱A,[0, 1]方格上放一个高度为5的棱柱B,棱柱B贡献的表面积的计算方式为:2(两个底面)+3*5(三个没有棱柱相邻的侧面)+(5-1)(与棱柱A接壤的侧面)=21。

边界。如果某一个棱柱已经在边界上,我们考察其周围四个相邻方向时,可能发现一个方向上已经超出棋盘范围,我们认为这个超出棋盘的位置上没有棱柱,也就是该相邻位置与当前接触面的面积concat为零,这个面贡献的表面积实际上就是当前棱柱的高度。

例如上述案例中,棱柱A贡献的表面积是:2(两个底面)+1(在边缘的侧面)+1(在边缘的侧面)+1(没有棱柱接壤的侧面)+0(与棱柱B接壤的侧面)=5,两个棱柱一共贡献表面积21+5=26。

编码过程如下:

class Solution:

def surfaceArea(self, grid):

"""

:param grid: List[List[int]]

:return: int

"""

N = len(grid)

ans = 0 # 总面积

for r in range(N):

for c in range(N):

if grid[r][c]: # 如果当前位置有柱体

ans += 2 # 上下底面

for nr, nc in ((r-1, c), (r+1, c), (r, c-1), (r, c+1)): # 考察四方

contact = grid[nr][nc] if 0 <= nr < N and 0 <= nc < N else 0 # 接触面

ans += max(grid[r][c] - contact, 0) # 减去接触面

return ans

如有疑问或建议,欢迎评论区留言~

python求球的表面积_892. 三维形体的表面积(Python)相关推荐

  1. LeetCode:892. 三维形体的表面积

    892. 三维形体的表面积 题目: 解题思路: 源码: 踩坑点: 题目: 解题思路: 我们先来理解一下题意: [[1,2],[3,4]]就是一个二维数组A.A[i][j]表示每一个以单位正方形为底的空 ...

  2. LeetCode 892. 三维形体的表面积

    892. 三维形体的表面积 思路:每列的长方形体积为4*grid[i][j]+2,减去抵消掉的表面积 class Solution { public:int surfaceArea(vector< ...

  3. LeetCode 三维形体的表面积

    在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...

  4. LeetCode简单题之三维形体的表面积

    题目 给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体.每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 放置好正方体 ...

  5. leetcode892. 三维形体的表面积

    在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...

  6. LeetCode 892. 三维形体的表面积(数学)

    1. 题目 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面 ...

  7. Leetcode:892. 三维形体的表面积(Java)

    在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...

  8. 力扣892.三维形体的表面积

    题目描述 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积 ...

  9. LeetCode(892)——三维形体的表面积(JavaScript)

    在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例1 ...

最新文章

  1. 802.11协议之BA/BAR帧
  2. 2018-2019-2 20189215 《网络攻防技术》第九周作业
  3. Python练习题:3 猜数游戏
  4. oracle vm突然黑屏了
  5. Android-清空栈内的activity
  6. SpringBoot 中如何使用JSP页面开发?
  7. UE编辑器去掉*.bak备份文件
  8. HTML将广告关闭的JS代码,js实现可关闭的对联对联广告代码广告效果代码
  9. 项目上线工作流程梳理
  10. 二叉树中序线索化分析
  11. wex5 php开发,WeX5开发移动APP(SQLite本地数据优化)
  12. 图像运动模糊及其去除
  13. laragon安装postgreSQL
  14. [技术干货] zabbix docker安装详细教程
  15. 量子力学在计算机上的应用论文,《浅谈量子力学的发展与利用》-毕业论文.docx...
  16. 爬取某知名网站的数据
  17. HTML table表格边框为单线的方法
  18. 学习yum info命令
  19. BEA助中国一汽构建核心ERP系统
  20. web前端期末大作业 html+css+javascript网页设计实例 宠物狗网站制作

热门文章

  1. MySQL搭建主从复制 读写分离 分库分表 MyCat高可用
  2. WeChat小程序报错Module not found: Can‘t resolve ‘umtrack-alipay‘ in
  3. Bug之ajax不执行
  4. General error: 24374 OCIStmtFetch: ORA-24374: define not done before fetch or execute and fetch
  5. Linux基础知识(1)
  6. java jar包图片_jar包的图片不显示 求解
  7. hp服务器raid制作,HP服务器建立RAID的两种方法
  8. linux内核挂载nfs,Linux 挂载NFS文件系统
  9. 大数据 清华 覃征_2021年清华(清华大学)大数据工程考研难度解析、考研经验分享...
  10. 【mysql】安装 mysql 5.7 完成后,默认密码是啥?怎么查看默认密码?