当前位置: 首页 > article >正文

【每日一题】最小面积矩形——从平行坐标轴到任意角度的完整攻略

一、题目对比题目LeetCode 939LeetCode 963题目名称最小面积矩形最小面积矩形 II边的限制必须平行于 x 轴和 y 轴任意角度不一定平行于坐标轴数据范围1 ≤ points.length ≤ 5001 ≤ points.length ≤ 50返回值整数面积浮点数面积误差 1e-5 内难度中等中等二、LeetCode 939最小面积矩形边平行于坐标轴2.1 题目描述给定在 xy 平面上的一组点确定由这些点组成的矩形的最小面积其中矩形的边平行于 x 轴和 y 轴。如果没有任何矩形返回 0。示例输入[[1,1],[1,3],[3,1],[3,3],[2,2]] 输出42.2 解题思路核心观察对于边平行于坐标轴的矩形只需要确定一条对角线即可确定整个矩形。如果已知矩形的两个对角点(x1, y1)和(x2, y2)那么另外两个点必然是(x1, y2)和(x2, y1)。算法流程将所有点存入哈希集合set实现 O(1) 查找枚举每一对点作为对角线检查另外两个角是否存在于点集中计算面积并更新最小值2.3 Python 代码实现classSolution:defminAreaRect(self,points:List[List[int]])-int: 思路枚举对角线 哈希集合查找 时间复杂度O(N^2)空间复杂度O(N) # 将所有点存入集合便于 O(1) 查找point_setset(map(tuple,points))nlen(points)resfloat(inf)# 枚举每一对点作为对角线foriinrange(n):x1,y1points[i]forjinrange(i1,n):x2,y2points[j]# 如果两点在同一水平线或垂直线上无法形成矩形ifx1x2ory1y2:continue# 检查另外两个顶点是否存在if(x1,y2)inpoint_setand(x2,y1)inpoint_set:# 计算矩形面积areaabs(x1-x2)*abs(y1-y2)resmin(res,area)return0ifresfloat(inf)elseres2.4 优化版本按列分组另一种思路是按 x 坐标分组然后找两列之间的公共 y 坐标fromcollectionsimportdefaultdictclassSolution:defminAreaRect(self,points:List[List[int]])-int: 优化思路按列分组找公共纵坐标 时间复杂度O(N^2) ~ O(N^1.5) 实际运行很快 columnsdefaultdict(list)forx,yinpoints:columns[x].append(y)# 记录 (y1, y2) - 最右侧出现的 x 坐标seen{}resfloat(inf)forxinsorted(columns):columncolumns[x]column.sort()mlen(column)# 枚举当前列中所有的纵坐标对foriinrange(m):forjinrange(i1,m):y1,y2column[i],column[j]# 如果之前见过这对纵坐标可以形成矩形if(y1,y2)inseen:widthx-seen[(y1,y2)]heighty2-y1 resmin(res,width*height)# 更新这对纵坐标最后出现的位置seen[(y1,y2)]xreturn0ifresfloat(inf)elseres三、LeetCode 963最小面积矩形 II边不平行于坐标轴3.1 题目描述给定 X-Y 平面上的点数组points返回由这些点形成的任意矩形的最小面积矩形的边不一定平行于 X 轴和 Y 轴。如果不存在矩形返回 0。示例输入points [[1,2],[2,1],[1,0],[0,1]] 输出2.00000 解释最小面积矩形由 [1,2]、[2,1]、[1,0]、[0,1] 组成面积为 2。3.2 解题思路核心观察矩形的两条对角线互相平分且长度相等即对角线中点相同且半长相等。算法流程枚举中心法枚举所有点对计算其中点坐标和半长到端点的距离按照中点坐标 半长作为 key 进行分组同一组内的任意两条线段可以构成一个矩形计算矩形面积取最小值为什么这样能确定矩形两条线段有相同中点 → 互相平分两条线段半长相等 → 对角线长度相等对角线互相平分且相等的四边形 → 矩形3.3 Python 代码实现importmathfromcollectionsimportdefaultdictfromtypingimportListclassSolution:defminAreaFreeRect(self,points:List[List[int]])-float: 思路枚举中心法 - 矩形的对角线互相平分中点相同且长度相等 - 按 (中点x, 中点y, 半长平方) 分组 时间复杂度O(N^2)空间复杂度O(N^2) nlen(points)# key: (中点x, 中点y, 半长平方) - value: 该组内的所有点groupsdefaultdict(list)# 枚举所有点对foriinrange(n):x1,y1points[i]forjinrange(i1,n):x2,y2points[j]# 计算中点坐标用 2*mid 避免浮点数精度问题mid_xx1x2 mid_yy1y2# 计算半长平方避免开方减少精度误差half_len_sq(x1-x2)**2(y1-y2)**2# 存入分组groups[(mid_x,mid_y,half_len_sq)].append((i,j))resfloat(inf)# 遍历每个分组组内任意两条线段可形成矩形forkey,pairsingroups.items():mlen(pairs)ifm2:continue# 枚举组内所有线段对foriinrange(m):p1_idx,p2_idxpairs[i]x1,y1points[p1_idx]forjinrange(i1,m):p3_idx,p4_idxpairs[j]x3,y3points[p3_idx]# 计算矩形面积 |向量1| * |向量2| * sin(夹角)# 等价于以两条对角线的一半为邻边的平行四边形面积的 2 倍# 或者利用叉积计算# 向量 p1-p3 和 p1-p4 是矩形的两条邻边# 但更简单的方法利用对角线性质# 面积 |AC| * |BD| * sin(theta) / 2# 其中 theta 是对角线夹角# 实际计算用向量叉积# 取 p1, p2 为一条对角线p3, p4 为另一条# 矩形的四个顶点为 p1, p3, p2, p4或类似排列# 计算向量vx1,vy1x3-x1,y3-y1# p1 - p3vx2,vy2x4-x1,y4-y1# p1 - p4 (x4, y4 需要先定义)# 修正我们需要正确获取 p4 的坐标# 实际上同一组内的两条线段 (p1,p2) 和 (p3,p4)# 矩形的四个顶点是 p1, p3, p2, p4# 计算邻边向量# 从 p1 出发到 p3 和 p4 的两条边x4,y4points[p4_idx]# 向量 p1-p3a1,b1x3-x1,y3-y1# 向量 p1-p4a2,b2x4-x1,y4-y1# 矩形面积 |a1*b2 - a2*b1| 叉积的绝对值areaabs(a1*b2-a2*b1)resmin(res,area)return0.0ifresfloat(inf)elsefloat(res)3.4 更简洁的实现推荐importmathfromcollectionsimportdefaultdictfromtypingimportListclassSolution:defminAreaFreeRect(self,points:List[List[int]])-float: 优化实现更清晰的面积计算 nlen(points)point_setset(map(tuple,points))resfloat(inf)# 枚举三个点确定第四个点foriinrange(n):x1,y1points[i]forjinrange(i1,n):x2,y2points[j]forkinrange(j1,n):x3,y3points[k]# 假设 (x2,y2) 和 (x3,y3) 是对角点# 第四个点 p2 p3 - p1 (向量运算)x4x2x3-x1 y4y2y3-y1# 检查第四个点是否存在if(x4,y4)notinpoint_set:continue# 检查是否是矩形邻边垂直点积为0# 向量 p1-p2 和 p1-p3dx1,dy1x2-x1,y2-y1 dx2,dy2x3-x1,y3-y1# 点积为0说明垂直ifdx1*dx2dy1*dy20:# 计算面积 |p1p2| * |p1p3|areamath.sqrt(dx1**2dy1**2)*math.sqrt(dx2**2dy2**2)resmin(res,area)return0.0ifresfloat(inf)elseres四、两道题目的对比总结对比维度LeetCode 939LeetCode 963核心性质边平行坐标轴 → 只需对角线两点任意角度 → 对角线互相平分且等长关键判定检查(x1,y2)和(x2,y1)是否存在检查第四个点是否存在 邻边垂直数据结构set存储所有点set存储所有点 分组或三重点枚举时间复杂度O(N²)O(N³) 或 O(N²)空间复杂度O(N)O(N) 或 O(N²)精度问题无整数运算需注意浮点数精度用叉积避免开方五、关键技巧与注意事项5.1 哈希集合的使用两道题都利用了哈希集合set实现 O(1) 的点查找这是解决几何问题的常用技巧。5.2 避免浮点数精度问题在 LeetCode 963 中中点计算使用2 * mid存储避免浮点数距离计算比较距离平方而非距离避免开方面积计算使用叉积公式|a×b| |x1*y2 - x2*y1|避免三角函数5.3 复杂度权衡939 题数据范围大500 点必须用 O(N²) 算法963 题数据范围小50 点O(N³) 枚举三重点完全可接受六、参考题目LeetCode 939枚举对角线 哈希集合LeetCode 963枚举中心法 / 枚举三角形法LeetCode 223矩形面积基础几何LeetCode 836矩形重叠区间重叠判定总结从平行于坐标轴的矩形到任意角度的矩形核心思路都是从对角线性质出发。939 题利用坐标轴平行的特性简化问题963 题则需要利用对角线互相平分且等长的矩形判定定理。掌握这两种思路可以应对大部分矩形相关的几何问题。

相关文章:

【每日一题】最小面积矩形——从平行坐标轴到任意角度的完整攻略

一、题目对比 题目LeetCode 939LeetCode 963题目名称最小面积矩形最小面积矩形 II边的限制必须平行于 x 轴和 y 轴任意角度,不一定平行于坐标轴数据范围1 ≤ points.length ≤ 5001 ≤ points.length ≤ 50返回值整数面积浮点数面积(误差 1e-5 内&#…...

Llama Vision-Instruct多模态AI部署与优化实战

1. 项目概述Llama Vision-Instruct模型的推出标志着多模态AI技术进入了一个新阶段。这个项目将视觉理解与指令跟随能力相结合,通过DigitalOcean的1-Click GPU Droplets部署方案,让开发者能够快速搭建和运行这类前沿AI模型。我在实际部署过程中发现&#…...

基于Continue的AI代码审查自动化:从原理到CI/CD集成实践

1. 项目概述与核心价值最近在琢磨怎么把AI代码审查这事儿给整得更自动化、更靠谱一点,正好深度体验了一把Continue这个开源项目。简单来说,Continue是一个能让你把AI智能体(Agent)直接集成到代码仓库和CI/CD流程里的工具。它的核心…...

ARM微控制器引脚配置与交叉开关架构实战指南

1. ARM微控制器引脚配置的工程挑战与解决方案在嵌入式系统开发中,GPIO引脚配置往往是项目启动阶段最耗时的环节之一。以常见的智能家居控制器为例,开发者需要同时处理UART通信、ADC采样、PWM输出等多个外设的引脚分配。传统配置方式需要反复查阅数百页的…...

基于深度学习的中医辨证系统 如何区分各种感冒?

基于深度学习的中医辨证系统,通过症状结构化、多模态特征融合、深度语义建模、证素推理四大核心流程,实现风寒/风热/风邪(病毒)感冒的精准区分。 一、先明确:三型感冒的中医辨证要点(模型判断依据&#xff…...

C语言学习笔记 - 17.C编程预备计算机专业知识 - 数据类型

一、数据类型的核心意义编程的第一步是将数据存储到计算机中(如图书管理系统的图书信息、人事管理系统的人员关系)。为了高效存储和处理不同类型的数据,需对数据进行分类,这就是"数据类型"的核心作用。数学中数据分为整…...

嵌入式事件驱动框架zeptoclaw:轻量级任务调度与协作式编程实践

1. 项目概述:一个为嵌入式与边缘计算而生的轻量级控制框架最近在折腾一些嵌入式项目,尤其是基于ESP32、树莓派Pico这类资源受限的MCU(微控制器)时,我总在寻找一个既轻量又灵活的控制框架。传统的实时操作系统&#xff…...

基于Flutter跨平台开发:UI组件设计与性能优化实战

基于Flutter 跨平台开发:UI组件设计与性能优化实战 欢迎加入开源鸿蒙跨平台社区: https://openharmonycrossplatform.csdn.net 摘要 Flutter 作为当下热门的跨平台 UI 开发框架,凭借自绘渲染、一套代码多端运行的核心优势,广泛应用…...

知识图谱驱动的旅游对话系统:Neo4j + BERT + Flask 完整实现

文章目录 知识图谱驱动的旅游对话系统:Neo4j + BERT + Flask 完整实现 一、系统架构 二、环境搭建 三、数据准备 3.1 CSV 格式 3.2 清洗 四、NLP 模块 4.1 分词与 POS 4.2 NER(spacy + 规则) 4.3 意图分类(BERT) 4.4 槽位填充 4.5 完整 Pipeline 五、知识图谱(Neo4j) 5.…...

IndexTTS-2-LLM实战:轻松制作有声书、播客的智能语音工具

IndexTTS-2-LLM实战:轻松制作有声书、播客的智能语音工具 1. 引言:为什么选择IndexTTS-2-LLM? 想象一下,你正在制作一档播客节目,或者想把一本电子书转换成有声读物。传统方式需要专业录音设备和配音演员&#xff0c…...

Java常见报错处理技术文章大纲

一、引言 Java错误处理的重要性:解释错误对程序稳定性的影响。 错误分类概述:简要介绍编译时错误、运行时错误和逻辑错误。 文章目标:帮助开发者快速识别、诊断和解决常见问题。 二、编译时错误处理 常见类型与原因: 语法错误(如缺少分号或括号)。 类型不匹配(如赋值给错…...

ARM架构EL2虚拟定时器寄存器原理与应用详解

1. ARM架构下EL2虚拟定时器寄存器深度解析在ARMv8-A架构的虚拟化环境中,定时器管理是Hypervisor实现精确调度的核心机制之一。作为系统开发者,理解EL2特权级的虚拟定时器寄存器工作原理,对于构建高效可靠的虚拟化平台至关重要。本文将深入剖析…...

算法训练营第十六天| 541.反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。 题目链接:https://leetcode.cn/problems/reverse-string-ii/ 视频链…...

虎贲等考 AI 智能写作 —— 全流程学术赋能,真实可信的论文智能辅助平台

虎贲等考 AI 智能写作(官网:https://www.aihbdk.com/)是基于人工智能技术、专为学术场景打造的全流程论文写作辅助工具,面向本硕博学生、科研工作者提供从开题报告、文献综述、正文撰写,到真实图表、数据、公式代码、问…...

写论文软件哪个好?2026 深度实测:虎贲等考 AI,毕业论文全流程合规神器,一次通关不踩坑

毕业季灵魂拷问:写论文软件哪个好?面对琳琅满目的写作工具,从通用大模型到专项学术平台,究竟谁才是真正能帮你高效、安全搞定毕业论文的 “真命天子”? 经过对 9 款主流工具的深度实测与对比,虎贲等考 AI凭…...

项目实训(三)

1...

开题报告卡到崩溃?虎贲等考 AI 一键成型,开题一次过、论文一路顺

对本科生、研究生来说,开题报告就是毕业论文的定盘星。题目通不过、文献不达标、框架不合理、研究方法写不清、创新点不突出…… 哪怕一个小问题被导师打回,整篇论文进度都会被拖慢,越改越焦虑、越写越迷茫。 如果你也在开题阶段反复内耗&am…...

模板工具进阶用法:构建高辨识度自媒体视觉体系的系统方法

自媒体内容竞争进入精细化运营阶段。视觉辨识度已成为账号差异化的核心识别要素。模板工具的价值不仅在于快速出图,更在于构建可复用、可演进的视觉体系。多数创作者停留在基础套用层面,导致内容同质化严重,难以形成稳定的记忆点。真正的进阶…...

MGRE综合实验报告册

实验要求:1,R5为ISP,只能进行IP地址配置,其所有地址均配为公有IP地址;2,R1和R5间使用PPP的PAP认证,R5为主认证方;R2与R5之间使用ppp的CHAP认证,R5为主认证方; R3与R5之间使用HDLC封装…...

让你的Emacs在MacOS上自动全屏启动

在MacOS 14 Sonoma系统上使用Emacs,尤其是在使用emacs-plus或doomemacs配置时,你可能已经注意到,默认情况下通过emacsclient -c启动的Emacs窗口大小较小,且没有获得焦点。这不仅影响了工作效率,还需要额外的操作来调整窗口大小和获取焦点。今天,我们将探讨如何让Emacs在启…...

Janus-Pro-7B嵌入式部署:STM32单片机上的轻量化推理

Janus-Pro-7B嵌入式部署:STM32单片机上的轻量化推理 1. 引言 想象一下,一个只有拇指大小的STM32单片机,竟然能运行70亿参数的多模态AI模型,还能生成文本和图像——这听起来像是科幻小说里的情节。但今天,我们要展示的…...

运维实战:监控与维护生产环境的DeOldify模型服务

运维实战:监控与维护生产环境的DeOldify模型服务 作为一名运维工程师,最怕的不是服务上线,而是上线之后。尤其是像DeOldify这样的AI模型服务,它不像普通的Web应用,背后是复杂的深度学习模型和GPU计算资源。服务跑起来…...

C#怎么设置JWT身份认证_C#如何生成并验证Token令牌【实战】

必须在Program.cs中调用AddJwtBearer()配置JWT认证&#xff0c;显式设置TokenValidationParameters各验证开关为true&#xff0c;严格匹配issuer/audience字符串&#xff0c;正确使用SecurityKey和SigningCredentials&#xff0c;并确保Authorization头格式为“Bearer <toke…...

小红书无水印下载终极指南:XHS-Downloader技术解析与实战应用

小红书无水印下载终极指南&#xff1a;XHS-Downloader技术解析与实战应用 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链…...

3个简单步骤:用GHelper手动风扇控制告别ROG笔记本噪音困扰

3个简单步骤&#xff1a;用GHelper手动风扇控制告别ROG笔记本噪音困扰 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix…...

Qwen3-4B-Thinking在法务助理场景的应用:合同审查要点生成案例

Qwen3-4B-Thinking在法务助理场景的应用&#xff1a;合同审查要点生成案例 1. 引言&#xff1a;当AI遇上法律文书 想象一下这样的场景&#xff1a;一位法务专员面前堆着几十份待审合同&#xff0c;每份都需要找出关键风险点。传统方式下&#xff0c;这可能需要数小时甚至数天…...

从代码编写者到AI工程师:掌握LLM开发技术栈的实战指南

Part.1 AI工程师都要会些什么&#xff1f; 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;技术的兴起&#xff0c;正在深刻影响软件的形态&#xff0c;开发者的工作也从实现业务逻辑、构建独立应用&#xff0c;转向以LLM为底层引擎快速搭建智能应用的…...

3个实用技巧:使用Playwright Stealth绕过网站自动化检测

3个实用技巧&#xff1a;使用Playwright Stealth绕过网站自动化检测 【免费下载链接】playwright_stealth playwright stealth 项目地址: https://gitcode.com/gh_mirrors/pl/playwright_stealth 在当今的Web自动化测试和数据采集场景中&#xff0c;网站的反爬虫机制变得…...

Linux系统启动优化利器boot-resume:原理、部署与实战

1. 项目概述&#xff1a;一个被低估的系统启动优化利器如果你是一位经常需要重启服务器、调试系统启动流程&#xff0c;或者对操作系统启动速度有极致追求的开发者或运维工程师&#xff0c;那么你很可能对Belugary/boot-resume这个项目产生浓厚的兴趣。乍一看这个标题&#xff…...

Phi-3.5-mini-instruct助力前端开发:JavaScript交互逻辑与文档生成

Phi-3.5-mini-instruct助力前端开发&#xff1a;JavaScript交互逻辑与文档生成 1. 前端开发的痛点与AI解决方案 现代前端开发面临两个核心挑战&#xff1a;复杂的交互逻辑需要清晰文档支持&#xff0c;而频繁的需求变更又要求快速产出高质量代码。传统模式下&#xff0c;开发…...