【LeetCode】892. Surface Area of 3D Shapes 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/surface-area-of-3d-shapes/description/
题目描述
On a N * N grid, we place some 1 * 1 * 1 cubes.
Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).
Return the total surface area of the resulting shapes.
Example 1:
Input: [[2]]
Output: 10
Example 2:
Input: [[1,2],[3,4]]
Output: 34
Example 3:
Input: [[1,0],[0,2]]
Output: 16
Example 4:
Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 32
Example 5:
Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 46
Note:
- 1 <= N <= 50
- 0 <= grid[i][j] <= 50
题目大意
所给出的数组是每个坐标下的z值,求整个空间图形的表面积。
解题方法
这个题乍一看和883. Projection Area of 3D Shapes非常相像。甚至我以为就是883题的答案乘以2就行。。但是我看到了第5个例子之后,眉头一皱发现事情并不简单。

实际上,要求整个图形的表面积,那么可以分解为求出每个立方体的表面积,然后减去重叠部分的面积就可以。按照这个思路,就变得简单了。
- 当只有1个立方体的时候,表面积是6;
- 如果有多个立方体摞在一起成为柱子的时候,表面积是grid[i][j] * 4 + 2;
- 如果有多个柱子的时候,需要减去重叠面积。重叠的高度是两个柱子之间,高度最小的那个的高度。因为重叠使得两个柱子都变矮了,所以要把这个高度*2.
举个例子:
对于第一个例子,输入只有一个柱子,柱子的高度是2,那么表面积是2 * 4 + 2 = 10。
再举个栗子
1,2
3,4
计算的时候是这样的:
- 首先看柱子1,表面积是6;
- 当添加柱子2,其表面积是
2 * 4 + 2 = 10,但是由于和左边的1有重叠,重叠面积是2,所以添加柱子2之后,总的表面积是6 + 10 - 2 = 14; - 当添加柱子3,柱子3的表面积是
3 * 4 + 2 = 14,由于和柱子1有重叠,重叠面积是2,所以添加柱子3之后,总面积是14 + 14 - 2 = 26; - 当添加柱子4,柱子4的表面积是
4 * 4 + 2 = 18,由于和柱子2和3有重叠,重叠面积是(2 + 3) * 2 = 10,所以添加柱子4之后,总面积是26 + 18 - 10 = 34。
Python代码如下:
class Solution(object):
def surfaceArea(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
area = 0
n = len(grid)
for i in range(n):
for j in range(n):
if grid[i][j]: area += grid[i][j] * 4 + 2
if i: area -= min(grid[i][j], grid[i-1][j]) * 2
if j: area -= min(grid[i][j], grid[i][j-1]) * 2
return area
二刷的写法如下。
class Solution(object):
def surfaceArea(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
count = 0
inner = 0
M, N = len(grid), len(grid[0])
for i in range(M):
for j in range(N):
count += grid[i][j]
if i < M - 1 and grid[i + 1][j] != 0:
inner += min(grid[i][j], grid[i + 1][j])
if j < N - 1 and grid[i][j + 1] != 0:
inner += min(grid[i][j], grid[i][j + 1])
if grid[i][j] >= 2:
inner += grid[i][j] - 1
print(count, inner)
return count * 6 - inner * 2
C++代码如下:
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int res = 0;
int N = grid.size();
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
res += grid[i][j] * 6 - max(0, grid[i][j] - 1) * 2;
if (i != 0) {
res -= min(grid[i - 1][j], grid[i][j]) * 2;
}
if (j != 0) {
res -= min(grid[i][j - 1], grid[i][j]) * 2;
}
}
}
return res;
}
};
日期
2018 年 8 月 26 日 ———— 珍爱生命,远离DD!
2018 年 11 月 9 日 —— 睡眠可以
2020 年 3 月 25 日 —— 想发财
【LeetCode】892. Surface Area of 3D Shapes 解题报告(Python)的更多相关文章
- LeetCode 892 Surface Area of 3D Shapes 解题报告
题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of ...
- [LeetCode] 892. Surface Area of 3D Shapes 三维物体的表面积
On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of v cu ...
- LeetCode 883 Projection Area of 3D Shapes 解题报告
题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. ...
- 【Leetcode_easy】892. Surface Area of 3D Shapes
problem 892. Surface Area of 3D Shapes 题意:感觉不清楚立方体是如何堆积的,所以也不清楚立方体之间是如何combine的.. Essentially, compu ...
- 892. Surface Area of 3D Shapes
问题 NxN个格子中,用1x1x1的立方体堆叠,grid[i][j]表示坐标格上堆叠的立方体个数,求这个3D多边形的表面积. Input: [[1,2],[3,4]] Output: 34 思路 只要 ...
- [LeetCode&Python] Problem 892. Surface Area of 3D Shapes
On a N * N grid, we place some 1 * 1 * 1 cubes. Each value v = grid[i][j] represents a tower of v cu ...
- 【leetcode】892. Surface Area of 3D Shapes
题目如下: 解题思路:对于v = grid[i][j],其表面积为s = 2 + v*4 .接下来只要在判断其相邻四个方向有没有放置立方体,有的话减去重合的面积即可. 代码如下: class Solu ...
- 【LeetCode】883. Projection Area of 3D Shapes 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 数学计算 日期 题目地址:https://leetc ...
- C#LeetCode刷题之#892-三维形体的表面积(Surface Area of 3D Shapes)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4136 访问. 在 N * N 的网格上,我们放置一些 1 * 1 ...
随机推荐
- kubernetes 用到的工具及组件
kubernetes 用到的工具及组件,将所有的组件下载后放到/usr/local/bin目录下(记得chmod a+x /usr/local/bin/*).所有的组件,原则上都用最新的,如果遇到不支 ...
- lxml解析库的安装和使用
一.lxml的安装lxml是Python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高.本节中,我们了解一下lxml的安装方式,这主要从Windows.Linux ...
- 点击下拉选择触发事件【c#】
<asp:DropDownList ID="ddlRegionList" runat="server" AutoPostBack="true&q ...
- 学习java 7.6
学习内容: 方法重写注意事项:子类不能重写父类的私有方法 子类的访问权限不比父类的低(父类默认,子类可以是默认也可以是public) java中继承的注意事项:java中类只支持单继承,java中类支 ...
- 大数据学习----day27----hive02------1. 分桶表以及分桶抽样查询 2. 导出数据 3.Hive数据类型 4 逐行运算查询基本语法(group by用法,原理补充) 5.case when(练习题,多表关联)6 排序
1. 分桶表以及分桶抽样查询 1.1 分桶表 对Hive(Inceptor)表分桶可以将表中记录按分桶键(某个字段对应的的值)的哈希值分散进多个文件中,这些小文件称为桶. 如要按照name属性分为3个 ...
- pyqt5 改写函数
重新改写了keyPressEvent() class TextEdit(QTextEdit): def __init__(self): QtWidgets.QTextEdit.__init__(sel ...
- 【Linux】【Basis】【网络】网络相关的内核参数
Linux系统内核设置优化tcp网络,# vi /etc/sysctl.conf,添加以下内容 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies.当出现SYN等待 ...
- 使用NSURLSessionDownloadTask实现大文件下载-监听下载进度
- 5.1 涉及知识点(1)创建NSURLSession并设置代理,通过NSURLSessionDownloadTask并以代理的方式来完成大文件的下载 //1.创建NSURLSession,设置代理 ...
- my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key. 间隙锁(Gap Lock): 锁定索引记录间隙,确保索引记录的间隙不变.间隙锁是 ...
- mybatis处理集合、数组参数使用in查询等语句的两种方法
对于mybatis的参数类型是集合数组的时候进行查询. 第一种:参数list使用mybatis的标签 SELECT * FROM TABLE_NAME AS a <where> <i ...