3种解法 - 计算三维形体的表面积
文章目录
- 题目
- 题解
- 示例一:[[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个面暴露的部分累加求和,分别站在每个面前面,从前到后进行求解,当然从算法层面可以对程序进行优化,但为了代码可读性依然保留了写作初始思路。
- 只要有立方体(值大于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: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次
- 时间复杂度: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
解法三(按坐标减)
思路:跟解法二类似,都是总体面积减去隐藏面积,不过是将坐标对应立方体看做一个整体单元,而非解法二中组成立方体的单个小立方体,当然也可以类推,基于解法一思路实现“按坐标加”。
- 每个坐标位置如果没有任何遮挡,暴露面积为 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]的值
- 减去四周被遮挡的面积,每个面被遮挡的面积等于较小的值
- 对于等于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种解法 - 计算三维形体的表面积相关推荐
- 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 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体.每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 放置好正方体 ...
- python求球的表面积_892. 三维形体的表面积(Python)
题目 难度:★★☆☆☆ 类型:几何.数学.二维数组 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, ...
- LeetCode 三维形体的表面积
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面积. 示例 ...
- leetcode892. 三维形体的表面积
在 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 ...
- LeetCode 892. 三维形体的表面积(数学)
1. 题目 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上. 请你返回最终形体的表面 ...
最新文章
- 跟着石头哥哥学cocos2d-x(三)---2dx引擎中的内存管理模型
- Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
- wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)
- 最大似然估计MLE和最大后验估计MAP理解
- asp.net常规页生命周期阶段列表和事件列表
- Seafile - 最好的 Dropbox 开源替代,面向团队而设计
- ubuntu进入桌面自动启动脚本_在 Ubuntu 下开机自启动自己的 QT 程序而不启动 Ubuntu 的桌面...
- mysql 修改root 密码
- Windows Forms 实现安全的多线程详解
- 前端开发~uni-app ·[项目-仿糗事百科] 学习笔记 ·000【前言】
- golang每隔10秒访问URL
- 服务器软件是否支持双机热备,服务器双机热备建议方案.doc
- 递归 非递归 遍历二叉树
- 牛客练习赛28 E【斜抛运动的最大水平射程】
- python中国地图代码 上色_用Python绘制中国地图
- php数据库无法插入数据,php无法插入数据怎么办
- Crucible 安装日志
- android 呼入电话游戏闪退,光遇闪退解决方法 游戏总是闪退怎么回事
- 【Arduino+ESP32专题】案例:使用INA3221监控电压电流 3—— Modbus通信
- 使用计算机生成遐想景物图像,计算机多媒体