zoukankan      html  css  js  c++  java
  • LeetCode-三维体的表面积

    题目描述:

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

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

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

    示例:

    输入:[[2]]
    输出:10
    输入:[[1,2],[3,4]]
    输出:34
    输入:[[1,0],[0,2]]
    输出:16
    输入:[[1,1,1],[1,0,1],[1,1,1]]
    输出:32
    输入:[[2,2,2],[2,1,2],[2,2,2]]
    输出:46

    解题思路:

    题都看不懂~(我最初看到题的想法)。解释一下示例中的输入表达的意思。

    示例1:在坐标(0,0)的单元格中放2个立方体。

    示例2:在坐标(0,0)的单元格中放1个立方体。坐标(0,1)的单元格中放2个立方体。坐标(1,0)的单元格中放3个立方体。坐标(1,1)的单元格中放4个立方体。

    ....

    然后再来看这道题,其实这个题目的意思就是求出这些立方体除了被遮盖的部分之外的其他部分的表面积。还是以示例中的输入举例。

    示例1:(0,0)中有2个立方体,把这两个立方体堆在一起(一个上面放上另一个),这就有两个面被遮挡,其他部分的表面积为(2*6 - 2*1  =>2个立方体,每个有6个面,被遮盖两个面,每个面1个平方)=10.

    示例2:共有10个立方体,26个面被覆盖,其他部分的表面积为(10*6 - 26*1)=34。

    ....

    看代码会理解的更彻底一点。同时一定要自己在纸上画画图。

    代码:

    class Solution:
    def surfaceArea(self, grid: List[List[int]]) -> int:
    if len(grid) == 0:
    return 0
    block = 0 # 统计共有多少个立方体
    cover = 0 # 统计有多少个面被其他面盖住,在所有的立方体的表面积上减去被盖住的面数×2

    for i in range(len(grid)):
    for j in range(len(grid[i])):
    if grid[i][j] > 0:
    block += grid[i][j]
    cover += grid[i][j] - 1
    if i > 0:
    cover += min(grid[i - 1][j], grid[i][j]) # 在同一行上,比较两个单元格中堆积的立方体数量,取小的那个
    if j > 0:
    cover += min(grid[i][j - 1], grid[i][j]) # 同理
    return block * 6 - cover * 2
  • 相关阅读:
    oracle如何查询哪个表数据量大
    SecureRandom生成随机数超慢 导致tomcat启动时间过长的解决办法
    smartctl----硬盘状态监控
    Oracle数据库的状态查询
    jdbc连接数据库使用sid和service_name的区别
    V$INSTANCE 字段说明
    V$PROCESS和V$SESSION,以及使用这两个视图能做什么
    NetOps Defined
    POI 海量数据
    HTML5 CSS3 诱人的实例: 3D立方体旋转动画
  • 原文地址:https://www.cnblogs.com/RiverMap/p/12569358.html
Copyright © 2011-2022 走看看