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

news2025/1/6 19:00:06

本文属于「征服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:

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

示例 2:

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

示例 3:

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

复杂度分析:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KCC@北京启动,为一个城市做好开源!

KCC&#xff08;开源社城市社区&#xff09;北京区在6月12日正式成立&#xff0c;吸引了众多开源爱好者和技术开发者参与。现场举行的活动围绕 “为一个城市做好开源” 的话题展开讨论&#xff0c;包括开发者关系、开源背后的无用之用、开源在中国的变化、开源的困难与挑战以及…

OpenAI ChatGPT 使用示例

1.编程应用 1.1. 生成例子代码 ChatGPT帮助我们生产我们需要的例子代码。而且准确率很高。即使你不懂某一种语言也没关系&#xff0c;一定程度上较低了程序员的的门槛。 我有三组数据&#xff0c;第一组是星期一到星期五&#xff0c;第二组是这一天的具体时间&#xff0c;第三…

etcd 备份操作---马哥教育

etcd安装&#xff1a; mkdir -pv etcd-download-test tar -zxvf etcd-v3.4.4-linux-amd64.tar.gz -C etcd-download-test/ 编辑修改系统环境变量 /etc/profile export ETCD_HOME/tmp/etcd-download-test/etcd-v3.4.4-linux-amd64 export PATH$PATH:$JAVA_HOME/bin:$ETCD_HOM…

html实现好看的个人介绍,个人主页模板2(附源码)

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 项目演示界面1.4 联系我界面 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/131257976 html实现好看的个人…

老胡的周刊(第095期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 tabby[2] 自托管的 AI 编码助手&#xff0c;…

230617安装SqlServer2017Express后,再安装一个SqlServer2017ExpressAdvanced

230616安装SqlServer2017Express 下载地址 选择语言 Microsoft SQL Server 2017 Express 下载地址: 简体中文 感谢下载 Microsoft SQL Server 2017 Express 获得下载软件 我将下载的文件的名称加上了SHA256值, 一长串 是一个 .exe 的自解压文件, 双击后,默认解压到同根文件夹…

计组期末模拟(补充)

单选题 2-1&#xff08;本题考查课程目标2&#xff09; 某计算机有 16 个通用寄存器&#xff0c;采用 32 位定长指令字&#xff0c;操作码字段&#xff08;含寻址方式位&#xff09;为 8 位&#xff0c;Store 指令的源操作数和目的操作数分别采用寄存器直接寻址和基址寻址方式…

PHP intval()函数详解,intval()函数漏洞原理及绕过思路

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 intval 一、进制自动转换二、转换数组三、转换小数…

#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看

前面的几篇文章,我们对SV仿真调度进行了理论分析和实战演练。那么工具厂商,对该类问题有没有提供相应的支持。这个应该是肯定的。因为我们知道,SV只是出于定义标准的角度,规定了仿真调度事件原理。但是具体实施细节,应是每家EDA仿真工具厂商根据自家的软件开发算法而定的。…

MySQL - 第3节 - MySQL数据类型

1.数据类型的作用 数据类型的作用&#xff1a; • 决定了存储数据时应该开辟的空间大小。 • 决定了如何识别一个特定的二进制序列。 • 决定了数据的取值范围。 2.数据类型分类 注&#xff1a;MySQL本身是不支持bool类型的&#xff0c;当把一个数据设置成bool类型时&#xff0…

NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

NetMock 简介&#xff1a;简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试 NetMock可让我们摆脱在测试环境中模拟请求和响应的复杂性。 NetMock是一个功能强大、用户友好的库&#xff0c;旨在简化模拟HTTP请求和响应的过程。 对开发者来说&#xff0c;测试HTTP请求经…

稳定?国企也裁员!

大家好&#xff0c;我是爱搞事情的了不起&#xff01; 我所在的公司是一家央企下面的子公司&#xff0c;号称“国企”。 提起国企&#xff0c;好多人的印象中是855不加班&#xff0c;不裁员&#xff0c;真实情况是这样吗&#xff1f; 当国企领导 去年过年聚会&#xff0c;一个部…

《微服务架构设计模式》第二章 服务的拆分策略

内容总结自《微服务架构设计模式》 服务的拆分策略 一、架构是什么软件架构的41视图模型为什么重要分层架构风格 二、定义微服务如何定义服务拆分难点定义服务API 一、架构是什么 软件架构的定义&#xff1a;计算机系统的软件架构是构建这个系统所需要的一组结构&#xff0c;包…

内参:美联储下半年加息时间表和路径

* * * 原创&#xff1a;刘教链 * * * 星球会员请直接转到知识星球查看全文&#xff1b; 普通读者可以微信付费查看本篇全文&#xff0c;也欢迎加入星球。 加入星球&#xff0c;解锁全年365天内参全文阅读权限 &#xff08;年费制 折合仅1.6元/天&#xff09; 6.15教链内参&…

redis锁

一、redis锁的实现 加锁命令&#xff1a; SETNX key value&#xff1a; 当键不存在时&#xff0c;对键进行设置操作并返回成功1&#xff0c;否则返回失败0。 Key是锁的唯一标识&#xff0c;一般按业务来决定命名&#xff1b; Value 往往用来比较加锁的是哪一个线程或者哪一个…

Linux [工具]

工具 补充yumyum的位置yum的使用yum的本质 vimvim的多模式vim多个模式的细节命令模式底行模式 vim的配置 补充 Linux系统中文件名后缀没有直接的意义 但是不代表Linux上的软件不需要后缀, 比如gcc yum yum的位置 我们在手机或者Windows上, 一般都有一个东西 应用商店. 这个东…

简要介绍 | 单目深度估计

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对单目深度估计进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 探索视觉世界的无限可能&#xff1a;单目深度估计介绍…

CANopen SDO下载

文章目录 CANopen SDO 下载SDO下载协议SDO下载启动协议SDO分段下载协议参考 CANopen SDO 下载 CANopen SDO下载分为快速&#xff08;expedited&#xff09;和正常&#xff08;normal&#xff09;两种&#xff0c;平时我们写对象字典基本都在用SDO快速下载&#xff08;适用于写…

网络安全竞赛——Windows服务漏洞扫描与利用

1.通过渗透机Kali Linux对靶机场景Windows 7进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中3389端口对应的服务状态信息作为Flag值提交&#xff1b; 进入kali命令控制台中使用如下命令 Flag&#xff1a;open 2.在msfconsole中用search命令搜索 MS12020 RDP拒…

ETCD简介

为什么使用ETCD ETCD简介ETCD发展史ETCD架构etcd数据通道具体交互 ETCD使用场景概念词汇 ETCD简介 现代键值&#xff08;Key - Value&#xff09;存储系统&#xff0c;ZooKeeper是历史最悠久的项目&#xff0c;起源于Hadoop。这里ETCD与Zk对比。 ETCD相比与ZK&#xff0c;更加…