详细介绍:LeetCode 391 完美矩形

news/2025/10/4 10:25:19/文章来源:https://www.cnblogs.com/lxjshuju/p/19125365

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码解析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在做矩形覆盖的题目时,很多人第一反应就是「遍历 + 合并区间」,但 LeetCode 的 完美矩形 题目可没那么简单。它不仅要求所有小矩形刚好拼出一个大矩形,而且不能有重叠、不能有缝隙,就像拼图一样必须严丝合缝。本文会带你逐步拆解问题,分析为什么简单的遍历不够用,并给出一个基于 面积校验 + 顶点校验 的高效解法。

描述

题目给你一组小矩形,每个矩形由左下角 (xi, yi) 和右上角 (ai, bi) 表示,矩形都是和坐标轴平行的。现在你要判断这些矩形是否能 完美拼接成一个更大的矩形

判断标准主要有两个:

  1. 拼接后的整体区域必须是一个完整的大矩形。
  2. 小矩形之间不能重叠,也不能留下空隙。

换句话说,我们不仅要保证拼出来的总面积等于大矩形的面积,还要保证小矩形的边界刚好吻合。

实际场景类比:
可以想象一下装修时铺瓷砖:如果你要用一堆小方砖铺满一个长方形的地板,那么这堆砖必须正好覆盖整个地板,不能多也不能少,更不能有两块砖重叠。

题解答案

核心思路是 面积校验 + 顶点唯一性

  1. 面积校验:所有小矩形的面积和必须等于大矩形的面积。
  2. 顶点校验:大矩形的四个顶点必须只出现一次,其它所有中间拼接的点必须出现偶数次(因为它们会被相邻矩形共享)。

一旦两个条件同时满足,就说明所有矩形能完美拼成一个大矩形。

题解代码分析

下面是完整的 Swift 实现代码:

import Foundation
class PerfectRectangle {
func isRectangleCover(_ rectangles: [[Int]]) -> Bool {
var minX = Int.max, minY = Int.max
var maxX = Int.min, maxY = Int.min
var areaSum = 0
var points = Set<String>()func addOrRemovePoint(_ x: Int, _ y: Int) {let key = "\(x),\(y)"if points.contains(key) {points.remove(key)} else {points.insert(key)}}for rect in rectangles {let x1 = rect[0], y1 = rect[1]let x2 = rect[2], y2 = rect[3]// 更新外接矩形边界minX = min(minX, x1)minY = min(minY, y1)maxX = max(maxX, x2)maxY = max(maxY, y2)// 累加面积areaSum += (x2 - x1) * (y2 - y1)// 处理矩形四个顶点addOrRemovePoint(x1, y1)addOrRemovePoint(x1, y2)addOrRemovePoint(x2, y1)addOrRemovePoint(x2, y2)}// 计算外接矩形的面积let expectedArea = (maxX - minX) * (maxY - minY)if areaSum != expectedArea {return false}// 外接矩形的四个顶点let expectedPoints = ["\(minX),\(minY)","\(minX),\(maxY)","\(maxX),\(minY)","\(maxX),\(maxY)"]// 校验点集合是否只剩下四个顶点if points.count != 4 {return false}for p in expectedPoints {if !points.contains(p) {return false}}return true}}

代码解析

  1. 边界计算:通过遍历所有矩形,记录整个覆盖区域的最小 (x, y) 和最大 (x, y),得到大矩形的外接边界。

  2. 面积验证:小矩形的面积总和必须和外接矩形的面积一致。

  3. 顶点处理

    • 对每个小矩形的四个顶点执行「异或」式的操作:如果顶点第一次出现就加入集合,如果再次出现就删除。
    • 最终应该只剩下外接矩形的四个顶点。
  4. 返回结果:如果面积对上,顶点集合正确,就返回 true

示例测试及结果

let solver = PerfectRectangle()
print(solver.isRectangleCover([[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]]))
// 输出: true
print(solver.isRectangleCover([[1,1,2,3],[1,3,2,4],[3,1,4,2],[3,2,4,4]]))
// 输出: false
print(solver.isRectangleCover([[1,1,3,3],[3,1,4,2],[1,3,2,4],[2,2,4,4]]))
// 输出: false

结果解释:

  • 第一个示例,小矩形严丝合缝拼成大矩形,返回 true
  • 第二个示例有间隙,返回 false
  • 第三个示例有重叠,返回 false

时间复杂度

  • 遍历所有矩形一次,每个矩形只处理 4 个顶点。
  • 时间复杂度为 O(n),其中 n 是矩形的数量。

空间复杂度

总结

这道题如果直接用模拟的方法去拼接,复杂度会非常高,尤其是 n 可以达到两万的时候,根本不可行。

真正的突破点在于 把二维覆盖问题转化成面积 + 顶点唯一性验证

  • 面积保证了整体没有缝隙;
  • 顶点唯一性保证了没有重叠。

这种解法思路非常优雅,既避免了暴力模拟,又保证了正确性。日常开发中,如果你遇到「多个区域拼接是否能完美组成大区域」的需求,比如地图划分、UI 布局检查,其实也可以借鉴这种「全局面积 + 局部边界」的思路来解决。

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

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

相关文章

[NOI2025] 集合 题解

[NOI2025] 集合 题解去不了 NOI 的菜鸡终于把集合看懂了,写个博客加深一下印象。 [NOI2025] 集合 要求: \[ans=\sum_P \sum_Q [f(p)=f(Q)][P\cap Q = \emptyset] \prod_{i\in P\cup Q} a_i \]先处理这题比较特殊的 \…

网站模板下载百度云链接怎么做的crm管理系统定制

本文由云社区发表本文作者&#xff1a;许中清&#xff0c;腾讯云自研数据库CynosDB的分布式存储CynosStore负责人。从事数据库内核开发、数据库产品架构和规划。曾就职于华为&#xff0c;2015年加入腾讯&#xff0c;参与过TBase(PGXZ)、CynosDB等数据库产品研发。专注于关系数据…

做文案策划需要用到的网站化妆品网站设计

常量是一个特殊的符号&#xff0c;它有一个从不变化的值。定义常量符号时&#xff0c;它的值必须能在编译时确定。确定之后&#xff0c;编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。在C#中一下类型都是基元类型&#xff0c;可用于定…

详细介绍:Linux 自定义shell命令解释器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

bi数据报表发送周期,周报和月报获取日期时间

bi数据报表发送周期,周报和月报获取日期时间bi数据报表发送周期,周报和月报获取日期时间 1.今天是周四,获取上周四-本周三的日期,格式为yyyyMMddHHmmssString startTime = "";String endTime = "&q…

自己站网站可以做h5游戏的网站

一.压榨历史 1.单进程人工切换。纸带机。只能解决简单的数学问题。 2.单道批处理。多进程批处理。多个任务批量执行。解决手动操作时需要人工切换作业导致的系统利用率低的问题 3.多进程并行处理。把程序写在不同的内存位置来回切换。当一个作业在等待I/O处理时&#xff0c;…

美工网站设计门户网站创新的方式有

利用两个管道进行进程间双向通信在第一篇练习已经大致作出说明&#xff0c;下面将进行一个更为综合的练习 首先看题目&#xff1a; 设有二元函数f(x,y) f(x) f(y) 其中&#xff1a; f(x) f(x-1) * x (x >1) f(x)1 (x1) f(y) f(y-1) f(y-2) (y> 2) f(y)1 (y1,2) 请编…

郑州机械网站建设导航滑动整屏网站

一、为什么要进行数据归一化 定义&#xff1a;把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则&#xff1a;样本的所有特征&#xff0c;在特征空间中&#xff0c;对样本的距离产生的影响是同级的&#xff1b;问题&#xff1a;特征数字化后&#xff0c;由于取值…

电脑科技网站模板外链工具在线

1.Java语言的特点&#xff1f; 1.一面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;2.平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b;(类是一种定义对象的蓝图或模板)3.支持多线程&#xff08; C 语言没有内置…

技术Leader的1-3-5沟通法则:向上管理的艺术 - 指南

技术Leader的1-3-5沟通法则:向上管理的艺术 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

【Phar反序列化】 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

永年网站建设创建全国文明城市总结

1 rtsp 接入 我们使用unity UE 等三维渲染引擎中使用c编写插件来接入rtsp 视频。同时做融合的时候&#xff0c;和背景的三维颜色要一致&#xff0c;这就要使用视频融合修正技术。包括亮度&#xff0c;对比度&#xff0c;饱和度的修正。在单纯颜色上的修正可以简单使用rgb->…

楚雄自助建站系统地税城市维护建设税网站是什么

Azure 提供了几种托管网站的方式&#xff1a;Azure 应用服务、虚拟机、Service Fabric 和云服务。 本文可帮助你了解这几种方式&#xff0c;并针对 Web 应用程序做出正确的选择。 Azure 应用服务是大多数 Web 应用的最佳选择。 部署和管理都已集成到平台&#xff0c;站点可以快…

济南php网站开发使用element做的网站

Mars 是一个并行和分布式 Python 框架&#xff0c;能轻松把单机大家耳熟能详的的 numpy、pandas、scikit-learn 等库&#xff0c;以及 Python 函数利用多核或者多机加速。这其中&#xff0c;并行和分布式 Python 函数主要利用 Mars Remote API。 启动 Mars 分布式环境可以参考…

柳市网站优化昌江县住房和城乡建设局网站

网上排出此错误方法的很多&#xff0c;但是 都不简洁&#xff0c;找不到根本原因 主要排查两点&#xff1a; 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&amp;characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…

网站备案中是什么意思新能源汽车车型及报价

给出两个正整数&#xff0c;判断他们的大小。 输入格式&#xff1a; 两个正整数。 输出格式&#xff1a; 若前者大&#xff0c;输出>&#xff1b; 若后者大&#xff0c;输出<&#xff1b; 若一样大&#xff0c;输出。 输入&#xff1a; 1412894619244619891 23762842…

完整教程:AI时代如何高效学习Python:从零基础到项目实战de封神之路(2025升级版)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

cannot resolve method add in T 及 T 泛型类型生成Excel文件,区别是数据Model不同

cannot resolve method add in T 及 T 泛型类型生成Excel文件,区别是数据Model不同cannot resolve method add in T 及 T 泛型类型生成Excel文件,区别是数据Model不同 1.通过继承父类来解决public void largeDataCre…

网站开发专员招聘企业网站需要多大带宽

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

备案中网站名称网站建设创客

*本文系SDNLAB编译自瞻博网络技术专家兼高级工程总监Sharada Yeluri领英 在路由器和交换机中&#xff0c;缓冲区至关重要&#xff0c;可以防止网络拥塞期间的数据丢失。缓冲区到底要多大&#xff1f;这个问题在学术界和工业界一直备受争议。本文探讨了高端路由器中数据包缓冲的…