LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

这篇具有很好参考价值的文章主要介绍了LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

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

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

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

示例 1:
LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

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

示例 2:
LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

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

示例 3:
LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

输入: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

这一题和HDU 5538类似,也和LeetCode 463. Island Perimeter完全相同。

解法 直接遍历+容斥原理

本题求的是叠方块的表面积,每个位置上的立方体(叠放的多个正方体)没有和周边立方体重叠时,本身表面积为 6 × h − ( h − 1 ) × 2 6 \times h - (h - 1) \times 2 6×h(h1)×2每个正方体贡献了 6 6 6 个表面积、再减去多个正方体重叠的面)。简化一下就是 4 × h + 2 4\times h+2 4×h+2考虑上底和下底面,以及每个正方体贡献的 4 4 4 个侧表面)。

再通过从左上到右下遍历,判断下方和右边是否有重叠的立方体,如果有重叠,计算当前立方体的表面积时,要减去 2 × min ⁡ ( g r i d [ i + 1 ] [ j ] ,   g r i d [ i ] [ j ] ) 2\times \min {(grid[i+1][j],\ grid[i][j])} 2×min(grid[i+1][j], grid[i][j]) (下方有重叠), 2 × min ⁡ ( g r i d [ i ] [ j + 1 ] ,   g r i d [ i ] [ j ] ) 2\times \min{}{(grid[i][j+1],\ grid[i][j])} 2×min(grid[i][j+1], grid[i][j]) (右侧有重叠),即可得到最终结果。

class Solution {
    public int surfaceArea(int[][] grid) {
        int ans = 0;
        int n = grid.length, m = grid[0].length;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (grid[i][j] == 0) continue;
                // ans += grid[i][j] * 6 - (grid[i][j] - 1) * 2;
                ans += (grid[i][j] << 2) + 2;
                if (i + 1 < n && grid[i + 1][j] != 0) // 右边
                    ans -= Math.min(grid[i][j], grid[i + 1][j]) << 1;
                if (j + 1 < m && grid[i][j + 1] != 0) // 下边
                    ans -= Math.min(grid[i][j], grid[i][j + 1]) << 1;
            }
        }
        return ans;
    }
}

复杂度分析:

  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( 1 ) O(1) O(1)

似乎还可稍作优化。上面的代码在循环中做了太多次乘法/移位操作,可将这些操作放到最后进行。
作为改进,整体思路是看看有多少个立方体,总表面积是立方体的数量 × 6 × 6 ×6 ,但上下叠放的正方体、和相邻的立方体会互相遮盖住,统计一下被盖住的面,最后减去被盖住的面就行:

class Solution {
    public int surfaceArea(int[][] grid) {
        int blocks = 0, cover = 0; // 正方体的个数,盖住的面的个数
        int n = grid.length, m = grid[0].length;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (grid[i][j] == 0) continue; 
                blocks += grid[i][j];
                cover += grid[i][j] - 1;
                if (i + 1 < n && grid[i + 1][j] != 0) // 右边
                    cover += Math.min(grid[i][j], grid[i + 1][j]);
                if (j + 1 < m && grid[i][j + 1] != 0) // 下边
                    cover += Math.min(grid[i][j], grid[i][j + 1]);
            }
        }
        return blocks * 6 - cover * 2;
    }
}

复杂度分析:文章来源地址https://www.toymoban.com/news/detail-495786.html

  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( 1 ) O(1) O(1)

到了这里,关于LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Neural Geometric Level of Detail: Real-time Rendering with Implicit 3D Shapes 论文笔记&环境配置

    发布于 CVPR 2021 论文介绍了一种具有神经SDF的复杂几何实时渲染方法。 论文提出了一种神经SDF表示,可以有效地捕获多个LOD,并以最先进的质量重建3D几何图形。 论文中的架构可以以比传统方法具有更高视觉保真度的压缩格式表示 3D 形状,并且即使在单个学习示例中也能跨不

    2024年01月24日
    浏览(43)
  • LeetCode-48. 旋转图像【数组 数学 矩阵】

    给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[7,4,1],[8,5,2],[9,6,3]] 示例 2: 输入:m

    2024年04月27日
    浏览(36)
  • CGAL的3D Alpha Shapes

            假设我们给定一个二维或三维的点集S,我们希望得到类似“这些点形成的形状”的东西。这是一个相当模糊的概念,可能有许多可能的解释,阿尔法形状就是其中之一。阿尔法形状可用于从密集的无组织数据点集进行形状重建。事实上,阿尔法形状是由一个边界

    2024年02月01日
    浏览(78)
  • Leetcode—1480.一维数组的动态和【简单】

    之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

    2024年02月04日
    浏览(34)
  • 3D Surface Subdivision Methods 3D 曲面细分方法

    原文地址: https://doc.cgal.org/latest/Subdivision_method_3/index.html#Chapter_3D_Surface_Subdivision_Methods 细分方法递归地细化控制网格并生成逼近极限表面的点。 该包由四种流行的细分方法及其细化主机组成。 支持的细分方法包括 Catmull-Clark、Loop、Doo-Sabin 和 √3 细分。 它们各自的细化宿主是

    2024年01月19日
    浏览(40)
  • LeetCode150道面试经典题-合并两个有序数组(简单)

    题目: 给你两个按 非递减顺序 排列的整数数组  nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对

    2024年02月14日
    浏览(40)
  • 【三】3D匹配Matching之可变形曲面匹配Deformable Surface—read_deformable_surface_model()算子

    😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 Halcon算子太多,学习查找都没有系统的学习查找路径,本专栏主要分享Halcon各类算子含义及用法,有时间会更新具体案例。 😊😊😊 具体食用方式:可以点击本专栏【Halcon算子快速查找】–搜索你要查询的算子名称;或者点击

    2024年02月14日
    浏览(59)
  • 【三】3D匹配Matching之可变形曲面匹配Deformable Surface—refine_deformable_surface_model()算子

    😊😊😊 欢迎来到本博客 😊😊😊 🌟🌟🌟 Halcon算子太多,学习查找都没有系统的学习查找路径,本专栏主要分享Halcon各类算子含义及用法,有时间会更新具体案例。 😊😊😊 具体食用方式:可以点击本专栏【Halcon算子快速查找】–搜索你要查询的算子名称;或者点击

    2024年02月11日
    浏览(43)
  • Open3D Surface reconstruction 表面重建

    在许多情况下,我们希望生成密集的3D几何体,即三角形网格(triangle mesh)。然而,从多视点立体方法或深度传感器中,我们只能获得非结构化的点云。要从此非结构化输入中获取三角形网格,我们需要执行表面重建。在文献中存在几种方法,Open3D目前实现了以下方法: Alpha

    2023年04月27日
    浏览(31)
  • BtcDet论文详解| Behind the Curtain: Learning Occluded Shapes for 3D Object Detection

    造成shape miss主要由三个原因: 外部遮挡。前方物体挡住了后面的物体,使得传感器难以感知到后面的物体。 信号丢失。由于目标的材质或者传感器的原因,一部分传感器信号丢失,使得传感器难以感知这个区域 自身遮挡。物体自身的靠近传感器的部分遮挡住了远离传感器的

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包