ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

LeetCode-Go 题解:223. Rectangle Area 矩形面积计算

LeetCode-Go 题解:223. Rectangle Area 矩形面积计算 LeetCode-Go 题解223. Rectangle Area 矩形面积计算【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文讲解 LeetCode 第 223 题「Rectangle Area矩形面积」在 LeetCode-Go 仓库中的完整解法给定两个轴对齐rectilinear矩形的左下角与右上角坐标如何在 O(1) 时间内求出二者在 2D 平面上覆盖的总面积。读完本文你将掌握「两个矩形面积之和减去重叠矩形面积」这一经典几何容斥模型并能直接复用仓库中已验证通过的 Go 实现与单元测试代码。题目描述在 2D 平面上有两个由直线构成的轴对齐矩形每个矩形由其左下角顶点和右上角顶点坐标定义矩形的边分别平行于 x 轴与 y 轴。要求计算这两个矩形覆盖的总面积。输入A, B, C, D为第一个矩形的(左下角 x, 左下角 y, 右上角 x, 右上角 y)E, F, G, H为第二个矩形的对应坐标。约束题目保证总面积不会超出int类型的最大值。示例Input: A -3, B 0, C 3, D 4, E 0, F -1, G 9, H 2 Output: 45第一个矩形覆盖区域为x ∈ [-3, 3], y ∈ [0, 4]面积为6 × 4 24第二个矩形覆盖区域为x ∈ [0, 9], y ∈ [-1, 2]面积为9 × 3 27二者重叠区域为x ∈ [0, 3], y ∈ [0, 2]面积为3 × 2 6。因此总覆盖面积为24 27 - 6 45。解题思路面积容斥原文档指出这是一道几何题由于只有两个矩形「先分别求两个矩形的面积加起来再减去两个矩形重叠的面积」即可。这正是集合论中的容斥原理在二维平面上的直接应用总面积 矩形1面积 矩形2面积 - 重叠面积重叠面积的求法是本题的核心对两个矩形的坐标区间分别取交集。x 轴方向重叠区间的左边界取两个矩形左边界的较大值max(A, E)右边界取两个矩形右边界的较小值min(C, G)y 轴方向重叠区间的下边界取两个矩形下边界的较大值max(B, F)上边界取两个矩形上边界的较小值min(D, H)。若两个矩形不相交则求出的区间会出现「左边界 ≥ 右边界」或「下边界 ≥ 上边界」的情况此时重叠宽度或高度为非正数重叠面积计为 0。Go 实现源码解析LeetCode-Go 仓库中该题的实现位于 leetcode/0223.Rectangle-Area/223. Rectangle Area.go全文如下package leetcode func computeArea(A int, B int, C int, D int, E int, F int, G int, H int) int { X0, Y0, X1, Y1 : max(A, E), max(B, F), min(C, G), min(D, H) return area(A, B, C, D) area(E, F, G, H) - area(X0, Y0, X1, Y1) } func area(x0, y0, x1, y1 int) int { l, h : x1-x0, y1-y0 if l 0 || h 0 { return 0 } return l * h } func max(a int, b int) int { if a b { return a } return b } func min(a int, b int) int { if a b { return b } return a }关键实现细节1. 重叠区间的投影计算X0, Y0, X1, Y1 : max(A, E), max(B, F), min(C, G), min(D, H)这一行同时完成 x、y 两个维度上的区间求交重叠矩形左下角为(max(A,E), max(B,F))右上角为(min(C,G), min(D,H))。只要任一维度的区间不重叠得到的重叠矩形就是「退化」的宽度或高度 ≤ 0。2. 辅助函数 area 天然处理不相交情形func area(x0, y0, x1, y1 int) int { l, h : x1-x0, y1-y0 if l 0 || h 0 { return 0 } return l * h }area先计算宽l和高h若任一不大于 0 则直接返回 0。这一设计使computeArea中三次调用area时无需额外判断两个矩形是否相交——当矩形不相交时重叠区域宽高为负自动被过滤为 0公式退化为两面积之和逻辑简洁且无分支遗漏。3. 极简的 max / min 辅助函数仓库遵循 Google Go 代码风格见仓库根目录 README.mdmax/min采用最朴素的内联比较实现无任何外部依赖也不依赖泛型go.mod 声明 Go 1.19详见 go.mod保证在任意 Go 版本下均可直接编译运行。复杂度分析时间复杂度O(1)仅进行常数次比较与乘法运算空间复杂度O(1)仅使用少量局部变量。单元测试与验证该题的测试代码位于 leetcode/0223.Rectangle-Area/223. Rectangle Area_test.go采用 LeetCode-Go 仓库统一的表格驱动风格先用para223结构体封装 8 个输入坐标用ans223封装期望输出再逐条断言。测试覆盖了两个典型用例输入A,B,C,D, E,F,G,H期望输出场景(-3, 0, 3, 4, 0, -1, 9, 2)45题目给出的相交示例两个矩形部分重叠(0, 0, 1, 1, 2, 2, 3, 3)2两个矩形完全分离重叠面积为 0第二个用例两个不重叠的 1×1 正方形正是对area辅助函数「宽高非正时返回 0」这一边界逻辑的验证若实现中缺少该防护结果会错误地变成1 1 1 3测试将直接失败。如何运行测试在仓库根目录执行针对单题的测试命令go test ./leetcode/0223.Rectangle-Area/...若想验证全仓库所有题解的覆盖率可运行仓库自带的 gotest.sh 脚本该脚本对./leetcode/...下的全部包一次性生成单一合法的覆盖率文件bash gotest.sh运行结果会打印类似【input】:{-3 0 3 4 0 -1 9 2} 【output】:45的逐条输出任一用例不匹配时t.Fatalf会立即报告输入、期望值与实际值。边界情况与易错点结合源码实现做题与手写该题时需特别注意负坐标题目示例本身包含负坐标如A -3, F -1区间求交用的是大小比较而非减法因此天然支持负坐标无需平移处理完全包含当一个矩形完全包含另一个时如A ≤ E, B ≤ F, C ≥ G, D ≥ H重叠区间等于被包含矩形本身容斥公式依然成立仅边界接触两个矩形仅边相邻或仅角相接时重叠宽度或高度为 0l 0 || h 0正确返回 0不会把「接触」误算为「相交面积」int 溢出题目约束保证总面积不超 int 范围但中间结果两矩形面积之和在实现中并未做溢出防护若自行扩展题目约束需考虑改用int64或大数。小结LeetCode 223 是一道简洁而典型的几何容斥题总面积 面积和 − 重叠面积其中重叠区间通过两个维度的max/min投影求交得到。LeetCode-Go 仓库的实现用 15 行代码完成了全部逻辑并通过辅助函数area将「不相交」这一边界情况收敛为零面积配合表格驱动测试覆盖了相交与分离两类核心场景。该解法同样适用于「多个矩形覆盖面积」系列问题的入门理解——理解了二维区间求交后续的区间合并、扫描线等进阶技巧就有了扎实的几何直觉基础。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表