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

LeetCode 每日一题笔记 日期:2026.06.19 题目:1840. 最高建筑高度

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.06.19
  • 题目:1840. 最高建筑高度
  • 难度:困难
  • 标签:数组、排序、贪心

1. 题目理解

问题描述
共有编号 1~n 的一排建筑,约束规则:

  1. 1号建筑高度固定为 0;
  2. 相邻建筑高度差不超过 1;
  3. 给定限制数组restrictions = [[id, maxHeight]],代表编号 id 的建筑高度不能超过 maxHeight;
    求所有建筑能达到的最大高度。

示例

输入:n = 10, restrictions = [[5,3],[2,5],[7,4]]
输出:5

2. 解题思路

核心观察

  1. 限制无序,必须先按建筑编号升序排序;
  2. 正向遍历:从左到右修正每个限制的合法上限,左侧建筑高度最多每次+1;
  3. 反向遍历:从右到左再次修正,右侧建筑高度最多每次+1;
  4. 任意两个限制建筑之间,能达到的峰值高度公式:(间距 + 左高度 + 右高度) / 2
  5. 最后还要对比末尾限制到 n 号建筑的最大高度。

算法步骤

  1. 无限制直接返回 n-1;
  2. 将限制数组按建筑编号升序排序;
  3. 正向遍历修正每个限制的合法最大高度;
  4. 反向遍历再次收紧高度限制;
  5. 遍历每一对相邻限制,计算区间峰值,更新全局最大值;
  6. 对比第一段区间、末尾到 n 的区间高度,返回最大值。

3. 代码实现

packagelc1800_lc1899.lc1840;importjava.util.Arrays;importjava.util.Comparator;classSolution{publicintmaxBuilding(intn,int[][]restrictions){if(restrictions==null||restrictions.length==0){returnn-1;}Arrays.sort(restrictions,Comparator.comparingInt(a->a[0]));intm=restrictions.length;intprevIdx=1;intprevH=0;for(inti=0;i<m;i++){intidx=restrictions[i][0];intlimit=restrictions[i][1];intmaxCan=prevH+(idx-prevIdx);restrictions[i][1]=Math.min(limit,maxCan);prevIdx=idx;prevH=restrictions[i][1];}prevIdx=n;prevH=n-1;for(inti=m-1;i>=0;i--){intidx=restrictions[i][0];intlimit=restrictions[i][1];intmaxCan=prevH+(prevIdx-idx);restrictions[i][1]=Math.min(limit,maxCan);prevIdx=idx;prevH=restrictions[i][1];}intres=0;prevIdx=1;prevH=0;for(inti=0;i<m;i++){intcurIdx=restrictions[i][0];intcurH=restrictions[i][1];intdist=curIdx-prevIdx;intmidMax=(dist+prevH+curH)/2;res=Math.max(res,midMax);prevIdx=curIdx;prevH=curH;}res=Math.max(res,prevH+(n-prevIdx));returnres;}}

4. 代码优化说明

classSolution{publicintmaxBuilding(intn,int[][]restrictions){intm=restrictions.length;// 无限制直接返回n-1if(m==0){returnn-1;}// 按建筑编号升序排序限制条件Arrays.sort(restrictions,(a,b)->a[0]-b[0]);// h数组存储每个限制建筑修正后的合法最大高度int[]h=newint[m];// 正向遍历:从1号建筑向右收紧高度上限h[0]=Math.min(restrictions[0][0]-1,restrictions[0][1]);for(inti=1;i<m;i++){h[i]=Math.min(h[i-1]+restrictions[i][0]-restrictions[i-1][0],restrictions[i][1]);}// 反向遍历:从右向左再次收紧高度上限for(inti=m-2;i>=0;i--){h[i]=Math.min(h[i],h[i+1]+restrictions[i+1][0]-restrictions[i][0]);}// 初始化答案:第一段1到首个限制的峰值 + 最后一个限制到n的峰值intans=Math.max((restrictions[0][0]-1+h[0])/2,h[m-1]+n-restrictions[m-1][0]);// 遍历相邻限制区间,计算区间内可达到的最高峰值for(inti=0;i<m-1;i++){ans=Math.max(ans,(restrictions[i+1][0]-restrictions[i][0]+h[i]+h[i+1])/2);}returnans;}}

5. 复杂度分析

  • 原始实现
    时间复杂度:O(mlog⁡m+m)O(m\log m + m)O(mlogm+m),排序占主要耗时,多次循环操作二维数组
    空间复杂度:O(1)O(1)O(1),原地修改限制数组,无额外容器
  • 优化实现
    时间复杂度:O(mlog⁡m+m)O(m\log m + m)O(mlogm+m),排序耗时不变,循环逻辑合并精简,减少重复下标计算
    空间复杂度:O(m)O(m)O(m),一维数组存储高度,不修改原限制数组;减少多层临时变量与分支判断,逻辑更紧凑

6. 总结

  • 核心:双向贪心修正限制高度,区间峰值公式求最大高度;
  • 优化亮点:使用一维数组分离编号与高度,减少二维数组频繁访问;合并最大值初始化逻辑,删减冗余临时变量;
  • 关键公式:两建筑区间峰值 = (建筑间距 + 左高度 + 右高度) // 2,是求解区间最高建筑的核心数学推导。
http://www.jsqmd.com/news/1068853/

相关文章:

  • 上门按摩平台的护城河,到底在哪里?
  • 2026年在惠州寻找靠谱的产品故事片影视制作服务商哪家更靠谱
  • FasiumAI 服装设计实战:从参考图到三视图与 AI 生成 Tech Pack 的完整流程
  • ASR与NLP:人工智能语言处理的双翼
  • 大模型调试不再靠猜(SITS 2026注意力异常检测引擎内测版限时开放,仅剩最后112个企业席位)
  • 一次内部转发引发的泄密复盘:边界防护为何挡不住文件失控
  • 软文发稿平台怎么选?从资源、优化、售后看懂平台差距
  • Litefuse 开源发布:一行命令部署 Agent 可观测与评估平台,单机版比 Langfuse 快 5.5 倍
  • IDEA搭建SpringBoot+Elasticsearch6.8完整流程
  • Deno 2.9 版本将推 deno desktop:小体积、跨平台,优势显著!
  • 红外冷媒传感器是什么?原理、选型、参数、应用对比全在这
  • 高危工业防爆监控选型技术指南:5 家合规厂商技术能力横向对比
  • NSK RNFCL2040A2 滚珠丝杠技术手册
  • 为什么92%的SITS 2026部署环境未通过对抗压力测试?3个被忽视的架构漏洞与修复优先级清单
  • 一键备份QQ相册,原图无损下载【QQ相册下载器】
  • 【JAVA毕设源码分享】基于springboot高校教学质量评估系统(程序+文档+代码讲解+一条龙定制)
  • 你的数字价值,不该被平台锁定|登陆HappyPlanet,共建全新数字世界!
  • 手机信号增强器的工作原理是什么?
  • 杂乱文件太多处理不过来?这套ETL方案专治各种“不服”(选做实验1)
  • 2026年装修选水漆工艺全屋定制厂家,如何避开环保陷阱?
  • NSK W1406FA-2-C3T5 高速精密滚珠丝杠技术详解
  • 极连AI 2026 最新价格解读:0.01倍率0.1/千万Token来就免费领取1亿Token教程
  • 立足光谱技术本源,兼容场景化价值选择 —— 三恩时点评光谱流式 VS 传统流式行业热点
  • TensorRT-Edge-LLM详解
  • 稳定不掉线 GPT5.5 中转站推荐
  • 车企需求验证:smart - mqtt 高可用比性能更重要
  • 主流地图服务选型对比与评估指南
  • 蛋仔网:CSDN技术文章怎么写,讲清低负载看板和安全记录
  • Codex 实战:简历项目怎么讲清楚
  • 性能碾压!RustFS 100KiB以下小文件场景全面超越MinIO,实测数据曝光