python求球的表面积_892. 三维形体的表面积(Python)
题目
难度:★★☆☆☆
类型:几何、数学、二维数组
在 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)相关推荐
- LeetCode:892. 三维形体的表面积
892. 三维形体的表面积 题目: 解题思路: 源码: 踩坑点: 题目: 解题思路: 我们先来理解一下题意: [[1,2],[3,4]]就是一个二维数组A.A[i][j]表示每一个以单位正方形为底的空 ...
- LeetCode 892. 三维形体的表面积
892. 三维形体的表面积 思路:每列的长方形体积为4*grid[i][j]+2,减去抵消掉的表面积 class Solution { public:int surfaceArea(vector< ...
- LeetCode 三维形体的表面积
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...
- LeetCode简单题之三维形体的表面积
题目 给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体.每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 放置好正方体 ...
- leetcode892. 三维形体的表面积
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...
- LeetCode 892. 三维形体的表面积(数学)
1. 题目 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面 ...
- Leetcode:892. 三维形体的表面积(Java)
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...
- 力扣892.三维形体的表面积
题目描述 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积 ...
- LeetCode(892)——三维形体的表面积(JavaScript)
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例1 ...
最新文章
- 802.11协议之BA/BAR帧
- 2018-2019-2 20189215 《网络攻防技术》第九周作业
- Python练习题:3 猜数游戏
- oracle vm突然黑屏了
- Android-清空栈内的activity
- SpringBoot 中如何使用JSP页面开发?
- UE编辑器去掉*.bak备份文件
- HTML将广告关闭的JS代码,js实现可关闭的对联对联广告代码广告效果代码
- 项目上线工作流程梳理
- 二叉树中序线索化分析
- wex5 php开发,WeX5开发移动APP(SQLite本地数据优化)
- 图像运动模糊及其去除
- laragon安装postgreSQL
- [技术干货] zabbix docker安装详细教程
- 量子力学在计算机上的应用论文,《浅谈量子力学的发展与利用》-毕业论文.docx...
- 爬取某知名网站的数据
- HTML table表格边框为单线的方法
- 学习yum info命令
- BEA助中国一汽构建核心ERP系统
- web前端期末大作业 html+css+javascript网页设计实例 宠物狗网站制作
热门文章
- MySQL搭建主从复制 读写分离 分库分表 MyCat高可用
- WeChat小程序报错Module not found: Can‘t resolve ‘umtrack-alipay‘ in
- Bug之ajax不执行
- General error: 24374 OCIStmtFetch: ORA-24374: define not done before fetch or execute and fetch
- Linux基础知识(1)
- java jar包图片_jar包的图片不显示 求解
- hp服务器raid制作,HP服务器建立RAID的两种方法
- linux内核挂载nfs,Linux 挂载NFS文件系统
- 大数据 清华 覃征_2021年清华(清华大学)大数据工程考研难度解析、考研经验分享...
- 【mysql】安装 mysql 5.7 完成后,默认密码是啥?怎么查看默认密码?