加载中...
892-三维形体的表面积(Surface Area of 3D Shapes)
发表于:2021-12-03 | 分类: 简单
字数统计: 384 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/surface-area-of-3d-shapes

英文原文

You are given an n x n grid where you have placed some 1 x 1 x 1 cubes. Each value v = grid[i][j] represents a tower of v cubes placed on top of cell (i, j).

After placing these cubes, you have decided to glue any directly adjacent cubes to each other, forming several irregular 3D shapes.

Return the total surface area of the resulting shapes.

Note: The bottom face of each shape counts toward its surface area.

 

Example 1:

Input: grid = [[2]]
Output: 10

Example 2:

Input: grid = [[1,2],[3,4]]
Output: 34

Example 3:

Input: grid = [[1,0],[0,2]]
Output: 16

Example 4:

Input: grid = [[1,1,1],[1,0,1],[1,1,1]]
Output: 32

Example 5:

Input: grid = [[2,2,2],[2,1,2],[2,2,2]]
Output: 46

 

Constraints:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 50
  • 0 <= grid[i][j] <= 50

中文题目

给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。

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

放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。

请你返回最终这些形体的总表面积。

注意:每个形体的底面也需要计入表面积中。

 

示例 1:

输入:grid = [[2]]
输出:10

示例 2:

输入:grid = [[1,2],[3,4]]
输出:34

示例 3:

输入:grid = [[1,0],[0,2]]
输出:16

示例 4:

输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32

示例 5:

输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
输出:46

 

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 50
  • 0 <= grid[i][j] <= 50

通过代码

高赞题解

解题思路:

题目需要求的是表面积,很多同学说看不懂题意,我这里画了几个示例图。
(c 几个破图画了半天! 宝宝们快给我点赞昂!!)

示例图

示例 1:

输入:[[2]]
输出:10

这个图长这样

image.png {:width=300}
{:align=center}

2 个立方体分别贡献了 5 个单位的表面积。后面示例的表面积你们可以自己数一数辣~

示例 2:

输入:[[1,2],[3,4]]
输出:34

这个示例你从右侧看就是长这个亚子:

image.png{:width=300}
{:align=center}

示例 3:

输入:[[1,0],[0,2]]
输出:16

这个示例长这个亚子:

image.png{:width=300}
{:align=center}

示例 4:

输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32

这个示例长这个亚子:

image.png{:width=300}
{:align=center}

中间是空心的!但是空心处那几个表面积也是要算的!

示例 5:

输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46

这个示例长这个亚子:

image.png{:width=300}
{:align=center}

中间看得像空心,但是中间那是有一个立方体哒!
俯视看是这个亚子:

image.png{:width=300}
{:align=center}

做法:

首先,一个柱体一个柱体的看,每个柱体是由:2 个底面(上表面/下表面)+ 所有的正方体都贡献了 4 个侧表面积
然后,把柱体贴合在一起之后,我们需要把贴合的表面积给减掉,两个柱体贴合的表面积就是 两个柱体高的最小值*2

[]
class Solution { public int surfaceArea(int[][] grid) { int n = grid.length, area = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 先把grid[i][j]赋值给level,省掉了bound check,可以略微略微略微优化一下耗时。。。 int level = grid[i][j]; if (level > 0) { // 一个柱体中:2个底面 + 所有的正方体都贡献了4个侧表面积 area += (level << 2) + 2; // 减掉 i 与 i-1 相贴的两份表面积 area -= i > 0? Math.min(level, grid[i - 1][j]) << 1: 0; // 减掉 j 与 j-1 相贴的两份表面积 area -= j > 0? Math.min(level, grid[i][j - 1]) << 1: 0; } } } return area; } }

统计信息

通过次数 提交次数 AC比率
33713 52822 63.8%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
893-特殊等价字符串组(Groups of Special-Equivalent Strings)
下一篇:
895-最大频率栈(Maximum Frequency Stack)
本文目录
本文目录