文章目录

  • 题目
  • 题解
    • 示例一:[[2]]
    • 示例 2:[[1,2],[3,4]]
    • 示例 3:[[1,0],[0,2]]
    • 示例 4:[[1,1,1],[1,0,1],[1,1,1]]
    • 示例 5:[[2,2,2],[2,1,2],[2,2,2]]
  • 解法一(按立方体加)
  • 解法二(按立方体减)
  • 解法三(按坐标减)

题目

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

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

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

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

提示:

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


题解

题目本身从描述看理解不太容易,我也是看了10几遍才理解,简单解释下:

示例一:[[2]]

表示在二维平面上,坐标为(0,0)的位置上,有一个高度为2的立方体

示例 2:[[1,2],[3,4]]

以左下角为原点(0,0),不同位置表示立方体高度,立方体的排列方式如下:
3 4
1 2

示例 3:[[1,0],[0,2]]

立方体的排列方式如下:
0 2
1 0

示例 4:[[1,1,1],[1,0,1],[1,1,1]]

立方体的排列方式如下:
1 1 1
1 0 1
1 1 1

示例 5:[[2,2,2],[2,1,2],[2,2,2]]

立方体的排列方式如下:
2 2 2
2 1 2
2 2 2


解法一(按立方体加)

思路:对每个坐标位置的立方体,对6个面暴露的部分累加求和,分别站在每个面前面,从前到后进行求解,当然从算法层面可以对程序进行优化,但为了代码可读性依然保留了写作初始思路。

  1. 只要有立方体(值大于0),则上下两个面的值都会暴露
  2. 对于第一排的立方体,暴露的面等于立方体高度(值大小)
  3. 对于后排的立方体,暴露的面等于高出前面立方体的高度(后面值减去当前值)
  • 时间复杂度:O(M*N)
  • 空间复杂度:O(1)
# author: suoxd123@126.com
class Solution:def surfaceArea(self, grid: List[List[int]]) -> int:cnt, m,n = 0, len(grid),len(grid[0])        for i in range(0,m):for j in range(0,n):# 上下面if grid[i][j] > 0:cnt += 2# 前面if i == 0: # 第一排cnt += grid[i][j]elif grid[i][j] > grid[i-1][j]:# 后排cnt += grid[i][j] - grid[i-1][j]# 后面if i == m - 1: # 第一排cnt += grid[i][j]elif grid[i][j] > grid[i+1][j]: # 后排cnt += grid[i][j] - grid[i+1][j]# 左面if j == 0: # 第一排cnt += grid[i][j]elif  grid[i][j] > grid[i][j-1]: # 后排cnt += grid[i][j] - grid[i][j-1]# 右面if j == n - 1: # 第一排cnt += grid[i][j]elif grid[i][j] > grid[i][j+1]: # 后排cnt += grid[i][j] - grid[i][j+1]return cnt

解法二(按立方体减)

思路:对每个坐标位置的立方体,减去6个面中被隐藏的部分。

  1. 上下两个面的值,仅当立方体大于一个时,在中间的部分才被隐藏了
  2. 第一排的立方体不会被隐藏,对于后排的立方体,隐藏的面等于相交的最小值
  3. 相交的面会减少两个立方体的暴露,因此一个方向仅需要遍历1次
  • 时间复杂度:O(M*N)
  • 空间复杂度:O(1)

当然,解法一也可以按照当前的写法进行改造,相邻两个立方体高度差即为暴露的部分,即前后方向使用:cnt += abs(grid[i][j] - grid[i-1][j])代替解法一中分别对前面和后面的计算。

# author: suoxd123@126.com
class Solution:def surfaceArea(self, grid: List[List[int]]) -> int:cnt, ov = 0, 0 # cnt:立方体总个数, ov:相交次数m,n = len(grid),len(grid[0])for i in range(0,m):for j in range(0,n):cnt += grid[i][j]# 上下面if grid[i][j] > 1:ov += grid[i][j] - 1# 前后 方向if i > 0:# 后排ov += min(grid[i][j], grid[i-1][j])# 左右 方向if j > 0: # 后排ov += min(grid[i][j] , grid[i][j-1])return cnt * 6 - ov * 2

解法三(按坐标减)

思路:跟解法二类似,都是总体面积减去隐藏面积,不过是将坐标对应立方体看做一个整体单元,而非解法二中组成立方体的单个小立方体,当然也可以类推,基于解法一思路实现“按坐标加”。

  1. 每个坐标位置如果没有任何遮挡,暴露面积为 4h+2=6∗h−2(h−1)4h+2 = 6*h - 2 (h - 1)4h+2=6∗h−2(h−1),h为立方体高度,即grid[i][j]的值
  2. 减去四周被遮挡的面积,每个面被遮挡的面积等于较小的值
  3. 对于等于0的坐标,面积不存在,直接跳过
  • 时间复杂度:O(M*N)
  • 空间复杂度:O(1)
# author: suoxd123@126.com
class Solution:def surfaceArea(self, grid: List[List[int]]) -> int:cnt, m,n = 0, len(grid),len(grid[0])        for i in range(0,m):for j in range(0,n):if grid[i][j] <= 0:#当前坐标不存在立方体continuecnt += 4 * grid[i][j] + 2                if i > 0:# 前面cnt -= min(grid[i][j], grid[i-1][j])if i < m - 1:# 后面cnt -= min(grid[i][j], grid[i+1][j])if j > 0:# 左面cnt -= min(grid[i][j], grid[i][j-1])if j < n - 1:# 右面cnt -= min(grid[i][j], grid[i][j+1])return cnt

3种解法 - 计算三维形体的表面积相关推荐

  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 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体.每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 放置好正方体 ...

  4. python求球的表面积_892. 三维形体的表面积(Python)

    题目 难度:★★☆☆☆ 类型:几何.数学.二维数组 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, ...

  5. LeetCode 三维形体的表面积

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

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

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

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

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

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

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

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

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

最新文章

  1. 跟着石头哥哥学cocos2d-x(三)---2dx引擎中的内存管理模型
  2. Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
  3. wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)
  4. 最大似然估计MLE和最大后验估计MAP理解
  5. asp.net常规页生命周期阶段列表和事件列表
  6. Seafile - 最好的 Dropbox 开源替代,面向团队而设计
  7. ubuntu进入桌面自动启动脚本_在 Ubuntu 下开机自启动自己的 QT 程序而不启动 Ubuntu 的桌面...
  8. mysql 修改root 密码
  9. Windows Forms 实现安全的多线程详解
  10. 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·000【前言】
  11. golang每隔10秒访问URL
  12. 服务器软件是否支持双机热备,服务器双机热备建议方案.doc
  13. 递归 非递归 遍历二叉树
  14. 牛客练习赛28 E【斜抛运动的最大水平射程】
  15. python中国地图代码 上色_用Python绘制中国地图
  16. php数据库无法插入数据,php无法插入数据怎么办
  17. Crucible 安装日志
  18. android 呼入电话游戏闪退,光遇闪退解决方法 游戏总是闪退怎么回事
  19. 【Arduino+ESP32专题】案例:使用INA3221监控电压电流 3—— Modbus通信
  20. 使用计算机生成遐想景物图像,计算机多媒体

热门文章

  1. 三星i908、iPhone3G对比评测
  2. 荣誉系统排名是整个服务器,魔兽世界怀旧服pvp荣誉系统是什么-魔兽世界怀旧服pvp荣誉系统奖励有哪些_牛游戏网...
  3. linux 用户相关操作
  4. Java中的请求域(Request)《笔记》
  5. maven deploy
  6. jrebel 反代理服务搭建
  7. halcon变量,图像与C++的一些转换(未完待续)
  8. python基础实例教程 微课版-Python爬虫开发实战教程(微课版)
  9. 酷炫机器人简笔画图片_卡通机器人简笔画图片
  10. python截取图片中的圆形区域