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

LeetCode 3453.分割正方形 I:二分查找

【LetMeFly】3453.分割正方形 I:二分查找

力扣题目链接:https://leetcode.cn/problems/separate-squares-i/

给你一个二维整数数组squares,其中squares[i] = [xi, yi, li]表示一个与 x 轴平行的正方形的左下角坐标和正方形的边长。

找到一个最小的y 坐标,它对应一条水平线,该线需要满足它以上正方形的总面积等于该线以下正方形的总面积。

答案如果与实际答案的误差在10-5以内,将视为正确答案。

注意:正方形可能会重叠。重叠区域应该被多次计数

示例 1:

输入:squares = [[0,0,1],[2,2,1]]

输出:1.00000

解释:

任何在y = 1y = 2之间的水平线都会有 1 平方单位的面积在其上方,1 平方单位的面积在其下方。最小的 y 坐标是 1。

示例 2:

输入:squares = [[0,0,2],[1,1,1]]

输出:1.16667

解释:

面积如下:

  • 线下的面积:7/6 * 2 (红色) + 1/6 (蓝色) = 15/6 = 2.5
  • 线上的面积:5/6 * 2 (红色) + 5/6 (蓝色) = 15/6 = 2.5

由于线以上和线以下的面积相等,输出为7/6 = 1.16667

提示:

  • 1 <= squares.length <= 5 * 104
  • squares[i] = [xi, yi, li]
  • squares[i].length == 3
  • 0 <= xi, yi<= 109
  • 1 <= li<= 109
  • 所有正方形的总面积不超过1012

解题方法:二分查找

先算下所有正方形的总面积,然后二分分割线高度,太低就高点太高就低点。

终止条件:两次计算结果分割线移动返回不超过10 − 5 10^{-5}105或直接进行50 5050次求值。

>>>10**9/2**461.4210854715202004e-05>>>10**9/2**477.105427357601002e-06
  • 时间复杂度O ( C × l e n ( s q u a r e s ) ) O(C\times len(squares))O(C×len(squares)),其中C = 50 C=50C=50C = log ⁡ 2 m a x ( s q u i r e s [ i ] [ 1 ] ) − m i n ( s q u i r e s [ i ] [ 1 ] ) C=\log_2{max(squires[i][1])-min(squires[i][1])}C=log2max(squires[i][1])min(squires[i][1])
  • 空间复杂度O ( 1 ) O(1)O(1)

AC代码

C++
/* * @LastEditTime: 2026-01-13 22:21:20 */classSolution{private:doublehalf=0;vector<vector<int>>squares;boolcheck(doubleh){doubletotal=0;for(vector<int>&s:squares){doublefrom=max(double(s[1]),h);doubleto=s[1]+s[2];total+=max(0.,(to-from)*s[2]);}returntotal>half;}public:doubleseparateSquares(vector<vector<int>>&squares){longlongtotal=0;// !!!!!记得初始化for(vector<int>&s:squares){total+=((longlong)s[2])*s[2];}this->squares=move(squares);half=1.*total/2;doublel=0,r=1000000000;for(int_=0;_<50;_++){doublemid=(l+r)/2;if(check(mid)){l=mid;}else{r=mid;}}returnl;}};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.cnnetsun.cn/news/606354.html

相关文章:

  • 一键部署+开箱即用,IndexTTS2降低语音合成门槛
  • Zotero插件市场终极指南:彻底解决插件管理难题
  • League Director实战指南:从游戏玩家到专业导演的3个关键步骤
  • 如何在Dev-C++中切换编译器?
  • 微信小程序逆向分析工具 wxappUnpacker 完整使用指南
  • Jasminum插件:如何快速抓取知网元数据的终极Zotero扩展指南
  • 【Python学习打卡-Day42】打开深度学习“黑箱”:从Hook回调到Grad-CAM可视化
  • Zotero Style:告别文献管理混乱的终极解决方案
  • iOS系统定制终极指南:Cowabunga Lite完整使用教程
  • 番茄小说下载器:5分钟快速上手指南
  • PCL2-CE启动器终极指南:快速打造专属Minecraft游戏空间
  • Display Driver Uninstaller终极指南:彻底清理显卡驱动的专业方案
  • 开源模型AnimeGANv2实战:轻量级CPU版一键部署教程
  • AI艺术创作新工具:AnimeGANv2创意应用实战案例
  • FunClip终极指南:AI智能剪辑如何颠覆传统视频制作
  • 终极Zotero插件市场指南:5步实现学术效率革命
  • Jasminum:重新定义你的中文文献管理体验
  • Jasminum插件:中文文献元数据智能管理解决方案
  • Android观影终极优化指南:告别卡顿与广告困扰
  • MTKClient终极指南:零基础掌握联发科设备刷机与救砖
  • AnimeGANv2一键部署教程:Docker镜像快速启动WebUI
  • MediaPipe Holistic参数详解:模型输入输出规范
  • iOS 15+个性化定制完全指南:免越狱美化新体验
  • Realtime Voice Changer完整教程:从零开始掌握RVC实时语音转换
  • 如何实现iOS美化:免越狱个性化定制完整指南
  • Holistic Tracking参数详解:468个面部点+33个姿态点检测
  • Jasminum插件:Zotero中文文献管理的终极解决方案
  • 纪念币自动化预约终极指南:告别手动抢购烦恼
  • Moonlight TV游戏串流完整教程:打造专属客厅游戏中心
  • Keil编辑器乱码处理实战案例:适合初学者参考